Beam 超实用examples之Pi值计算

Beam Pi值计算

Beam刚刚开源不是很久,快2个月了。目前的版本是0.5.0版本。官方的源码中提供了4个examples.无奈这四个案例都只是WordCount的四种不同的实现。作为一个从Spark进入大数据殿堂的笔者来说,用过n多次的SparkPi的我,怎么能忍受竟然没有Pi实现的example呢。假如有了这个案例,可以非常方便的无论在开发工具中还是在集群中进行测试。于是便有了下文。笔者的文笔和技术有限。不足之处,还望朋友多多提建议。Let us come on 。

我们先来讲讲Pi的实现原理。我们是用概率统计的方法来实现的。先来想象一下,以一个单位为半径画圆,再画一个圆的外切正方形。假设一个杯子的底部就被这个正方形和正方形内切圆全部填满。做n次试验,往杯子中扔石头,落在圆内的次数除以总次数是不是Pi*r*r/2r*2r也就是Pi/4.

因此,Pi就是4倍的此概率。

以下是代码的试验。仅供参考。

可以复制代码

package org.tongfang.beam.examples;

import java.util.ArrayList;

import java.util.List;

import org.apache.beam.runners.spark.SparkRunner;

import org.apache.beam.sdk.Pipeline;

import org.apache.beam.sdk.options.PipelineOptions;

import org.apache.beam.sdk.options.PipelineOptionsFactory;

import org.apache.beam.sdk.transforms.*;

public class BeamPi {

public static void main(String[] args) {

// Beam Pi的自定义实现方式

//第一步骤:创建options,

//通过该对象可以选择使用哪个计算框架来计算,并且设置应用的名称

PipelineOptions options = PipelineOptionsFactory.create();

//设置job(应用)名称

options.setJobName("Beam Pi");

//设置runner为Spark

options.setRunner(SparkRunner.class);

//创建管道 p

Pipeline p = Pipeline.create(options);

//100000000次的随机试验的次数,如果资源,

//足够的大可以进行更多次的试验,用大数据的理论来说,

//理论上可以进行无数次的试验(只要不断的横向扩展计算的资源)。

List<Integer> list = new ArrayList<Integer>();

for(int i = 0;i<1000000;i++){

list.add(i);

}

//相当于Spark从内存中读取数据,并通过map迭代访问每一个元素,

//这里迭代1000000的访问每个依次增大的数字,

//没迭代一次,做一次试验,当点落到圆内,计数增加1,否则不计数

//也就是什么也不做

//然后再近些Count计数,最后计数结果除以试验次数,就是概率。

//从数学角度来看,PI的值就是4倍这个概率。从而计算出PI的值。

p.apply(Create.of(list)).apply(ParDo.of(new DoFn<Integer, Integer>() {

double x = 0;

double y = 0;

private static final long serialVersionUID = 1L;

@ProcessElement

public void processElement(ProcessContext c) {

x = Math.random() * 2 - 1;;

y = Math.random() * 2 - 1;;

if((x*x+y*y)<1){

c.output(1);

}else{

}

}

})).apply( Count.<Integer>globally()).

apply(MapElements.via(new SimpleFunction<Long, Void>() {

/**

*

*/

private static final long serialVersionUID = 1L;

public Void apply(Long input) {

Float res = (float) (4.0*(float)input / 1000000f);

System.out.println(input);

System.out.println("PI :  "+res);

return null;

}

}));

//这是运行计算的关键,如果这个代码不写,

//整个代码都是懒加载,并非真正计算。

p.run().waitUntilFinish();

}

}

时间: 2024-10-05 22:01:02

Beam 超实用examples之Pi值计算的相关文章

用hadoop计算PI值

一.计算PI值的方式与原理 百度一下,计算PI的方法还真不少.但在hadoop examples代码中的注释写的是:是采用 Quasi-Monte Carlo 算法来估算PI的值. 维基百科中对Quasi-Monte Carlo的描述比较理论,好多难懂的公式. 好在google了一把,找到了斯坦福大学网站上的一篇文章:<通过扔飞镖也能得出PI的值?>,文章很短,图文并茂,而且很好理解. 我这里将那篇文章的重要部分截了个图: 对上面的图再稍微解释一下:       1.Figure2是Figur

使用随机数计算pi值--java实现

1.先上一张图 2.原理分析 上图展示的是,在二维坐标图中,半径为1的圆的1/4, 随机n个点(x坐标在0~1之间,并且y坐标在0~1之间),落在半径为1的圆内部,当点的样本足够多的时候,形成1/4的饼图. 3.代码实现 /** * */ package com.sunny.www.interview; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Scanner; /** * 使用随机数

Pi的计算

百度百科 圆周率用希腊字母 π(读作pài)表示,是一个常数(约等于3.141592654),是代表圆周长和直径的比值.它是一个无理数,即无限不循环小数.在日常生活中,通常都用3.14代表圆周率去进行近似计算.而用十位小数3.141592654便足以应付一般计算.即使是工程师或物理学家要进行较精密的计算,充其量也只需取值至小数点后几百个位. [1]          1965年,英国数学家约翰·沃利斯(John Wallis)出版了一本数学专著,其中他推导出一个公式,发现圆周率等于无穷个分数相乘

整理打印PI值

准备锻炼背诵PI的小数,找到PI值: PI=3. 1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679 8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196 44288109756659334461284

MVC 下 ajax调用 日期差值计算

背景: 服务项目已有服务期起止时间From-To 现在要根据用户输入的新的起始时间, 和该服务期的原有区间值, 计算出新的服务期截止时间 即 NewServiceToDateTime = NewServiceFromDateTime + ( OldServiceToDateTime - OldServiceFromDateTime) 本示例的效果: 1.日期转换 及 差值计算 2.mvc 下 ajax 调用及赋值 相关代码如下: 后台Controller下Action处理 public Date

Java常用工具类(计算MD5,验证码随机生成,天数差值计算)

写这个博文的目的是为了怕哪天自己的电脑崩溃了,以前写的那些代码就没了,所以将自己写的工具类贴出来,方便以后去使用,也避免自己反复去创造轮子, 也可以对这些方法进行简单修改来完成业务需求,这样就可以极大的提高开发的效率. 方法一:计算字符串的MD5的值 使用方法很简单,直接把值传入方法中就可以了,会返回一个字符串String注意去获取. public final static String calculateMD5(String s) { char hexDigits[] = { '0', '1'

Hibernate中HQL的日期差值计算,可计算相差多少秒

最近有个业务需求就是计算订单创建时间离现在超过 4 小时的订单都查找出来! 那么就需要用到日期函数了. 网上找了一下总共的日期函数有一下几个: CURRENT_DATE() 返回数据库当前日期 时间函数 JPAQL HQL CURRENT_DATE() 返回数据库当前日期 CURRENT_TIME() 时间 时间函数 JPAQL HQL CURRENT_TIME() 返回数据库当前时间 SECOND(d) 从日期中提取具体秒 时间函数 HQL SECOND(时间字段) 空的时候返回null MI

ArcGIS for Android地图上实际距离与对应的屏幕像素值计算

/** * 将实际地理距离转换为屏幕像素值 * * @param distance * 实际距离,单位为米 * @param currScale * 当前地图尺寸 * @param context * @return */ public static double metreToScreenPixel(double distance, double currScale, Context context) { float dpi = context.getResources().getDispla

css权值计算

外部样式表<内部样式表<内联样式: HTML 标签选择器的权值为 1: Class 类选择器的权值为 10: ID 选择器的权值为 100: 内联样式表的权值最高 1000: !important权值最高: 脚本的样式最牛逼: 以上所有都一样,看顺序,后者覆盖前者.