在Spark Python中对rdd执行Set-Difference

2024-04-26 02:35:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个spark RDD,A有301500000行,B有1500000行。B中的150万行也出现在A中。我想要这两个RDD之间的设置差异,这样我返回的A包含300000000行,而B中的1500000行不再存在于A中

我不能使用Spark数据帧。在

这是我现在使用的系统。这些RDD有主键。下面我要做的是创建一个(收集的)出现在B中的主键的列表,然后迭代a的主键,找到那些没有出现在B主键列表中的主键。在

a = sc.parallelize([[0,"foo",'a'],[1,'bar','b'],[2,'mix','c'],[3,'hem', 'd'],[4,'line','e']])
b = sc.parallelize([[1,'bar','b'],[2,'mix','c']])
b_primary_keys = b.map(lambda x: x[0]).collect()  # since first col = primary key


def sep_a_and_b(row):
    primary_key = row[0]
    if(primary_key not in b_primary_keys):
        return(row)


a_minus_b = a.map(lambda x: sep_a_and_b(x)).filter(lambda x: x != None)

现在,这在这个示例问题中有效,因为A和B都很小。然而,当我使用真实的数据集A和B时,这是不成功的。有没有更好的(更并行的)方法来实现这一点?在


Tags: 数据lambdakeymap列表barkeyssep
1条回答
网友
1楼 · 发布于 2024-04-26 02:35:47

这似乎可以用subtractByKey来解决

val filteredA = a.subtractByKey(b)

要更改为键值:

^{pr2}$

*请注意,我的python很弱,可能有更好的方法来分割值

相关问题 更多 >