gpt4 book ai didi

python - 如何在一次传递的 Spark 中添加元组列表中第二个元素的长度?

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:39 25 4
gpt4 key购买 nike

我有一个元组列表:

myTuples = sc.parallelize([('ID1',['r','t','q']),
('ID2',['b','u','n']),
('ID4',['n','n'])])

我想计算元组中所有第二个元素的所有长度之和。因此,在这种情况下,这将是 3+3+2=8

我知道可以分两次完成:

countTupleLengths = myTuples.map(lambda aTuple: len(aTuple[1]))
LengthSum = countTupleLengths.reduce(lambda a, b: a + b)

但从概念上讲,可以一次完成。可以计算长度,然后将其添加到下一个计算的长度,等等。我觉得我可以为此使用 reduce,但由于两者之间的数据类型不同,我无法解决这个问题一个长度(整数)和一个列表:

# throws an error because len() produces an integer,
# and len(integer) doesn't make sense when reduce makes its recursive call
LengthSum = myTuples.reduce(lambda aTuple, bTuple: len(aTuple) + len(bTuple))

如何一次完成此操作?或者,pyspark 是否会在幕后对其进行优化,并且由于其惰性评估而实际上一次完成?

最佳答案

Spark 在内存中执行其计算,因此您不应该在执行 map 和 reduce 时对性能造成太大影响。也就是说,如果您想通过一次操作完成整个计算,您可以使用 Spark 累加器。

my_job.py

from pyspark import SparkContext

def main():
sc = SparkContext(appName='myapp')

myTuples = sc.parallelize([('ID1',['r','t','q']),
('ID2',['b','u','n']),
('ID4',['n','n'])])
acc = sc.accumulator(0)

def addToAcc(val):
acc.add(len(val[1]))

myTuples.foreach(addToAcc)
print acc

if __name__ == '__main__':
main()

运行:

$ ./spark-submit /path/to/my_job.py 
8

关于python - 如何在一次传递的 Spark 中添加元组列表中第二个元素的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33715016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com