PySpark评估
我正在尝试以下代码,该代码向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]
这意味着无论 范围(4) 为何,该理解仅将值3用于变量i 。
为什么会发生这种现象?
-
它的发生是由于Python的后期绑定,而不是特定于(Py)Spark的。
i
将在lambda 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]]