过滤操作时在pyspark操作中结合两个rdd

时间:2019-12-24 20:53:00

标签: python python-3.x apache-spark pyspark rdd

我必须执行基于rdd的操作。我的操作如下;

test1 = rdd.filter(lambda y: (y[0] >= y[1])) # condition 1
test2 = rdd.filter(lambda y: (y[0] < y[1])) # condition 2
result1 = test1.collect()
result2 = test2.collect()
print('(',len(result1),',',len(result2),')')

我可以将这两个条件组合成一个rdd吗? 我尝试过这样的事情

test3 = test1.zip(test2).collect()

但是它没有用。例如如果将collect()应用于test1 rdd,则会得到一个列表。然后我找到该列表的长度。同样,我对test2 rdd做同样的事情。现在的问题是,我可以一次完成吗?一口气找到列表的长度。

2 个答案:

答案 0 :(得分:3)

IIUC,您可以将两个条件映射到一个元组,然后将生成的布尔值转换为整数,然后进行reduce:

# create a sample of rdd with 30 elements
import numpy as np
from operator import add

rdd = sc.parallelize([*map(tuple, np.random.randint(1,100,(30,2)))])

rdd.map(lambda y: (int(y[0] >= y[1]), int(y[0] < y[1]))) \
   .reduce(lambda x,y: tuple(map(add, x,y)))
#(19, 11)

答案 1 :(得分:1)

您是说只得到一个结果而不是2个结果吗?

   test = rdd.filter(lambda y: (y[0] >= y[1]) and ((y[0] < y[1])))