PySpark评估

发布于 2021-01-29 18:27:13

我正在尝试以下代码,该代码向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 。

为什么会发生这种现象?

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    它的发生是由于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]]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看