使用 PySpark 求均值、最值与方差#
目录#
1. 背景#
最近需要学习Spark的相关知识,于是我选择从简单的统计数值开始学习,写一篇笔记记录学习过程。
完整代码与运行结果请参考Github。
2. 使用IPython启动PySpark#
在命令行输入下面的命令,就可以使用 IPython
启动 Spark
。
PYSPARK_DRIVER_PYTHON=ipython pyspark
使用Jupyter Notebook
启动 Spark
。
PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS="notebook" pyspark
也可以先启动Jupyter Notebook
,然后再创建Spark
应用。
from pyspark import SparkConf, SparkContext
# local[*] 表示最大线程数,一般为CPU核数
conf = SparkConf().setMaster("local[*]").setAppName('My App')
sc = SparkContext(conf = conf)
启动 Spark
以后,可以在浏览器访问 localhost:4040
进入 Saprk UI
可视化界面。
3. 创建数据#
从文件创建数据。
lines = sc.textFile("README.md")
# 统计元素个数
lines.count()
# 显示第一个元素,也就是 README.md 中的第一行
lines.first()
从内存创建数据。
## 从内存创建一个RDD
nums = sc.parallelize([1, 2, 3, 4, 5])
4. 所有元素的总和#
如果RDD中每个元素是单个值,则通过 传入输入参数为 个值的函数时,它会被顺序作用在不同的分区当中。计算各分区的结果 以后,再通过 连接。
# 求和
nums.reduce(lambda x, y: x + y)
# 15
# 减法计算,5个数的计算顺序为 (1 - 2 - 3) - (4 - 5)
sc.parallelize([1, 2, 3, 4, 5]).reduce(lambda x, y: x - y)
# -3
5. 不同分区数量情况下RDD的计算#
RDD的分区数量会影响到计算的并行性。
我的硬件配置信息如下:
型号名称: MacBook Pro
型号标识符: MacBookPro12,1
处理器名称: Dual-Core Intel Core i5
处理器速度: 2.7 GHz
处理器数目: 1
核总数: 2
超线程技术: 已启用
内存: 8 GB
首先,创建一个大一些的数据进行测试。
# 先创建一个数组
array = [i for i in range(int(1e7))]
len(array)
# 10000000
创建不同分区大小的RDD。
# 创建单个分区RDD
rdd1 = sc.parallelize(array, 1)
# 创建两个分区的RDD
rdd2 = sc.parallelize(array, 2)
# 创建默认数量分区的RDD,在我的机器上默认为4
rdd3 = sc.parallelize(array)
单个分区的RDD
进行reduce
运算时,只有单个Task
被启动,单线程运行。
# 单线程运行
%timeit rdd1.reduce(lambda x, y: x - y)
# 3.52 s ± 261 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
两个分区的RDD
进行reduce
运算时,两个Task
被启动,双线程运行。
# 双线程运行
%timeit rdd2.reduce(lambda x, y: x - y)
# 1.86 s ± 88.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我的机器在默认情况下为4分区,4线程。
# 四线程运行
%timeit rdd3.reduce(lambda x, y: x - y)
# 2.39 s ± 186 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
6. 最值#
# 最大值
nums.reduce(lambda x, y: max(x, y))
# 5
# 最小值
nums.reduce(lambda x, y: min(x, y))
# 1
7. 均值#
avg = nums.reduce(lambda x, y: x + y) / nums.count()
avg
# 3.0
8. 方差#
nums.map(lambda x : x - avg).map(lambda x: x * x).reduce(lambda x, y: x + y)
# 10.0
联系邮箱:curren_wong@163.com
CSDN:https://me.csdn.net/qq_41729780
知乎:https://zhuanlan.zhihu.com/c_1225417532351741952
公众号:复杂网络与机器学习
欢迎关注/转载,有问题欢迎通过邮箱交流。