我必须执行基于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做同样的事情。现在的问题是,我可以一次完成吗?一口气找到列表的长度。
答案 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])))