【发布时间】:2022-01-10 21:58:22
【问题描述】:
当以下代码运行时:
A = ss.sparkContext.parallelize(range(1, 100))
t = 50
B = A.filter(lambda x: x < t)
print(B.count())
t = 10
C = B.filter(lambda x: x > t)
print(C.count())
输出是:
49
0
这是不正确的,因为在 10 和 49 之间有 39 个值。似乎将 t 从 50 更改为 10 也影响了第一个过滤器,并且它得到了重新评估,因此当两个过滤器连续应用时,它实际上变成了 @ 987654324@ 这将导致 1, 2, 3, 4, 5, 6 ,7, 8, 9 后跟 x>10 导致空 rdd。
但是当我在代码中添加调试打印时,结果不是我所期望的,我正在寻找解释:
A = ss.sparkContext.parallelize(range(1, 100))
t = 50
B = A.filter(lambda x: x < t)
print(B.collect())
t = 10
print(B.collect())
print(B.count())
C = B.filter(lambda x: x > t)
print(C.collect())
print(C.count())
输出是:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
9
[]
0
为什么t=10 之后的计数是 10,但 print(B.collect()) 显示的预期 rdd 值从 1 到 49?如果在更改t 后触发收集重新执行filter,那么collect() 不应该显示1-9 的值吗?
我是 pyspark 的新手,我怀疑这与 spark 的惰性操作和缓存有关。有人可以解释幕后发生的事情吗?
谢谢!
【问题讨论】:
标签: pyspark filter rdd python-3.9