这里分析一下spark自带的求PI的例子,做为入门的代码
首先要介绍一下这个求PI的原理
其实也算是使用的蒙特卡洛模拟算法, 基本的方法就是考虑一下边长为1的正方形
其中以正方形的一个点为中心,以1为半径画圆的话,可以有1/4个圆画到
正方形中, 根据这个原理来随机的生成(1, 1)之间的点
如果满足x2 + y2 <= 1的话,那么就是在扇形区域内
否则在扇形区域外
用这种方法随机生成很多点的话,用扇形区域内的点数比上总数
可以近似理解为扇形的面积
S:扇形区域内点数
N:总点数
1/4rr*PI = S/N
可的PI=4S/N
代码实现就如下面所示
import sys
from random import random
from operator import add
from pyspark import SparkContext
if __name__ == "__main__":
"""
Usage: pi [partitions]
"""
//初始化sc
sc = SparkContext(appName="PythonPi")
//设置并行度
partitions = int(sys.argv[1]) if len(sys.argv) > 1 else 2
n = 100000 * partitions
//定义闭包函数
def f(_):
x = random() * 2 - 1
y = random() * 2 - 1
return 1 if x ** 2 + y ** 2 < 1 else 0
//这里的map函数类似于hadoop的map过程,reduce也是类似于reduce过程,最后得到的是数量的加和
//这里的reduce也可以按照key来
count = sc.parallelize(range(1, n + 1), partitions).map(f).reduce(add)
print("Pi is roughly %f" % (4.0 * count / n))
sc.stop()
由上面的程序可见,使用spark编写mr程序是很方便的
不用像hadoop那样写那么长的java程序来做,而且支持多种语言