【问题标题】:What is the meaning of neutral zero value in the fold function of pyspark?pyspark的fold函数中的中性零值是什么意思?
【发布时间】:2020-02-07 16:05:53
【问题描述】:
这里是代码sn-p
from operator import add
iris1 = sc.textFile("./dataset/iris_site.csv")
iris1_split = iris1.map(lambda var1: var1.split(","))
iris1_split.map(lambda col:float(col[0])).fold(0,add)
以下是我对折叠功能的理解:
-
用于聚合。
-
add 是在 index 1 列中添加度量数据的运算符。
-
根据this post,第一个参数称为中性零值。 (但这实际上意味着什么我不知道。)
-
我尝试将零值更改为 1、2、-2、10,然后分别发生以下增量和减量 2、4、-4、20。
通过观察递增/递减的模式,
这个等式看起来像 result = 2*neutral_zero_value + aggregation_result
在 foldByKey 函数中也可以看到类似的 zeroValue。
点击此处获取鸢尾花Dataset
【问题讨论】:
标签:
python
python-3.x
apache-spark
pyspark
rdd
【解决方案1】:
中性零值实际上是操作的一个标识元素。在上面显示的情况下,操作是加法,因此单位元必须为 0。如果是乘法,则单位元必须为 1。
现在为什么需要中性零?
所以,类似于 fold() 有 reduce()。在将空集合提供给 reduce() 时,它会引发异常,因为在中性零的帮助下已经为空集合定义了 fold()。
类比
把它想象成一个变量 sum,它被初始化为 0 以进行加法运算。
sum_ = 0 # here 0 is an identity element for addition
collection = [1,2,4,5]
for elem in collection:
sum_ += elem
即使您传递一个空列表,也会定义 sum_。
同样,乘法
prod = 1 # here 1 is an identity element for multiplication
collection = [1,2,4,5]
for elem in collection:
prod *= elem
有关更多详细信息,请参阅此article。阅读其中的 reduce 和 fold 函数。