![梁超实用例子之π值计算“> <p类=?6”wx-bdc>梁刚刚开源不是很久,快2个月了。目前的版本是0.5.0版本。官方的源码中提供了4个例子。无奈这四个案例都只是WordCount的四种不同的实现。作为一个从火花进入大数据殿堂的笔者来说,用多过n次的SparkPi的我,怎么能忍受竟然没有π实现的例子呢。假如有了这个案例,可以非常方便的无论在开发工具中还是在集群中进行测试。于是便有了下文。笔者的文笔和技术有限。不足之处,还望朋友多多提建议我们一起来alt=](/zixun/d/file/hulianwang/2021-06-02/a05b5102cc4b94695657d9d5adf23263.jpg )
可以复制代码
包org.tongfang.beam.examples;
进口java.util.ArrayList;
进口并不知道;
进口org.apache.beam.runners.spark.SparkRunner;进口org.apache.beam.sdk.Pipeline;
进口org.apache.beam.sdk.options.PipelineOptions;进口org.apache.beam.sdk.options.PipelineOptionsFactory;
进口org.apache.beam.sdk.transforms。*;
公共类BeamPi {
公共静态void main (String [] args) {
//梁π的自定义实现方式
//第一步骤:创建选项,
//通过该对象可以选择使用哪个计算框架来计算,并且设置应用的名称
=PipelineOptionsFactory.create PipelineOptions选项();
//设置工作(应用)名称
选项。setJobName(“梁π”);
//设置运动员为火花
options.setRunner (SparkRunner.class);
//创建管道p
管道p=Pipeline.create(选项);
//100000000次的随机试验的次数,如果资源,
//足够的大可以进行更多次的试验,用大数据的理论来说,
//理论上可以进行无数次的试验(只要不断的横向扩展计算的资源).
List
(int i=0; i<1000000;我+ +){
list.add (i);
}
//相当于火花从内存中读取数据,并通过地图迭代访问每一个元素,
//这里迭代1000000的访问每个依次增大的数字,
//没迭代一次,做一次试验,当点落到圆内,计数增加1,否则不计数
//也就是什么也不做
//然后再近些计数计数,最后计数结果除以试验次数,就是概率。
//从数学角度来看,π的值就是4倍这个概率。从而计算出π的值。
p.apply (Create.of(列表))苹果(帕尔多。(新DoFn<整数,Integer> () {
双x=0;
双y=0;
私有静态最终长serialVersionUID=1 l;
, @ProcessElement
,,,,,公共空间processElement (ProcessContext c) {
,,,,,,x=math . random () * 2 - 1;;
y=math . random () * 2 - 1;;
如果((x * x + y * y) & lt; 1) {
c.output (1),
}其他{
}
,,,,,,
,}
}))。应用(计数。你们;Integer>全球())。
(MapElements申请。通过(新SimpleFunction<长,Void> () {
/* *
, *,
, */
私有静态最终长serialVersionUID=1 l;
公共无效申请(长输入){
浮动res=(浮动)(4.0 *(浮动)输入/1000000 f);
System.out.println(输入),
system . out。println(π:+ res);
返回null;
}
}));
//这是运行计算的关键,如果这个代码不写,
//整个代码都是懒加载,并非真正计算。
p.run () .waitUntilFinish ();
}
}