gpt4 book ai didi

python - PySpark 评估

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:14 30 4
gpt4 key购买 nike

我正在尝试以下代码,该代码向 RDD 中的每一行添加一个数字,并使用 PySpark 返回 RDD 列表。

from pyspark.context import SparkContext
file = "file:///home/sree/code/scrap/sample.txt"
sc = SparkContext('local', 'TestApp')
data = sc.textFile(file)
splits = [data.map(lambda p : int(p) + i) for i in range(4)]
print splits[0].collect()
print splits[1].collect()
print splits[2].collect()

输入文件(sample.txt)中的内容是:

1
2
3

我期待这样的输出(分别将 rdd 中的数字添加到 0、1、2):

[1,2,3]
[2,3,4]
[3,4,5]

而实际输出是:

[4, 5, 6]
[4, 5, 6]
[4, 5, 6]

这意味着推导式仅使用变量 i 的值 3,而不考虑范围(4)

为什么会发生这种行为?

最佳答案

发生这种情况是因为 Python 后期绑定(bind),而不是 (Py)Spark 特定的。 ilambda p : int(p) + i时将被查找是在使用时使用的,而不是在定义时使用的。通常,这意味着它被调用时,但在这个特定的上下文中,它是当它被序列化以发送给工作人员时。

例如,您可以这样做:

def f(i):
def _f(x):
try:
return int(x) + i
except:
pass
return _f

data = sc.parallelize(["1", "2", "3"])
splits = [data.map(f(i)) for i in range(4)]
[rdd.collect() for rdd in splits]
## [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]

关于python - PySpark 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56177156/

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