我正在嘗試對 RDD 的所有元素求和,然后將其除以元素數。我能夠解決它,但使用不同的線路。但是,我只想使用 RDD 操作在一行中完成。
例如,RDD 是:
rdd_example = [(eliana,1),(peter,2),(andrew,3),(paul,4),(jhon,5)]
第一步是使用帶有 lambda 的方法映射僅提取數字:
numbers = rdd_example.map(lambda x: x[1])
輸出是:
numbers = [1,2,3,4,5]
然后所有元素的總和,使用方法reduce:
from operator import add
sum = numbers.reduce(add)
然后使用計數方法創建另一個變數來計算元素:
number_elem = rdd_example.count()
然后進行除法以獲得結果:
result = sum/number_elem
我想只用一行和一個變數來完成所有這些。
uj5u.com熱心網友回復:
使用fold它可以一次性聚合計數和總和:
cnt, total = rdd_example.fold((0, 0), lambda res, x: (res[0] 1, res[1] x[1]))
print(total / cnt)
# 2.5
注意在呼叫中,我們使用一個元組來存盤計數和總和:
rdd_example.fold((0, 0), lambda res, x: (res[0] 1, res[1] x[1]))
# ^ ^ ^^^^^^^^^^ ^^^^^^^^^^^^^^
# ^ init sum add 1 to count / add value to sum
# init count
uj5u.com熱心網友回復:
對于單行解決方案,請注意您正在計算數字的平均值(平均值)。PySpark 已經有一個mean()方法:
rdd_example = sc.parallelize([("eliana",1),("peter",2),("andrew",3),("paul",4),("jhon",5)])
result = rdd_example.map(lambda x: x[1]).mean()
print(result)
# output: 3.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311436.html
上一篇:Java中的Spark記錄鏈接
