spark自带的python例子的分析

2443 查看

这里分析一下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程序来做,而且支持多种语言