PySpark 函数在 mapValues 和过滤器之间表现不同

PySpark function behaving different between mapValues and filter

我正在使用 pyspark 在 spark 中工作。当我使用

下面的 lambda 时,我有一个格式为 [(key, (num, (min, max, count))),....] 的 rdd
t = fullBids.filter(lambda (value, stats): (stats[2] > 10 and stats[0] < value and value < stats[1]))

它出错了

tuple index out of range

但是当我在 mapValues 调用中使用它时,它运行成功,正确返回 True 或 False。

ti = fullBids.mapValues(lambda (value, stats): (stats[2] > 10 and stats[0] < value and value < stats[1]))

我希望过滤器可以工作,但事实并非如此。有人可以解释我在这里缺少什么吗?

调用filter时,value是键值对RDD的键,而stats是RDD((num, (min, max, count)))的值,即为什么你有 tuple index out of range.

当您调用 mapValues 时,valuenumstats(min, max, count)。事实上,mapValues 转换传递键值对 RDD 中的每个值。

如果你分解你的RDD格式

(key, (num, (min, max, count)))

key = value
(num, (min, max, count)) = stats
num = stats[0]
(min, max, count) = stats[1]
min = stats[1][0]
max = stats[1][1]
count = stats[1][2]

所以你的stats[2]超出了范围