我试图在rdd的几列上应用过滤器。我想传递一个索引列表作为参数来指定要过滤的索引,但是pyspark仅应用最后一个过滤器。
我已将代码分解为一些简单的测试用例,并尝试了非循环版本,它们可以正常工作。
test_input = [('0', '00'), ('1', '1'), ('', '22'), ('', '3')]
rdd = sc.parallelize(test_input, 1)
# Index 0 needs to be longer than length 0
# Index 1 needs to be longer than length 1
for i in [0,1]:
rdd = rdd.filter(lambda arr: len(arr[i]) > i)
rdd.top(5)
# rdd.top(5) gives [('0', '00'), ('', '22')]
# Only 2nd filter applied
VS
test_input = [('0', '00'), ('1', '1'), ('', '22'), ('', '3')]
rdd = sc.parallelize(test_input, 1)
rdd = rdd.filter(lambda arr: len(arr[0]) > 0)
rdd = rdd.filter(lambda arr: len(arr[1]) > 1)
rdd.top(5)
# rdd.top(5) gives [('00', '00')] as expected
我希望与非循环版本相比,循环会产生相同的结果