如何在for循环中为pyspark应用多个过滤器

时间:2019-07-22 22:18:17

标签: python-2.7 loops filter pyspark rdd

我试图在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

我希望与非循环版本相比,循环会产生相同的结果

0 个答案:

没有答案