求均值方差_使用 PySpark 求均值、最值与方差

使用 PySpark 求均值、最值与方差

目录

  • 目录

  • 1. 背景

  • 2. 使用IPython启动PySpark

  • 3. 创建数据

  • 4. 所有元素的总和

  • 5. 不同分区数量情况下RDD的计算

  • 6. 最值

  • 7. 均值

  • 8. 方差

1. 背景

最近需要学习Spark的相关知识,于是我选择从简单的统计数值开始学习,写一篇笔记记录学习过程。

完整代码与运行结果请参考Github[1]

3e56762e1ef971b81d28293f5685488b.png

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

公众号复杂网络与机器学习

欢迎关注/转载,有问题欢迎通过邮箱交流。

参考资料

[1]

Github: https://github.com/CurrenWong/LearnSparkFromZero

f6464f6f2de52f1c79131fc26ff0cda5.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值