我有两个火花RDD,A有301,500,000行,B有1,500,000行。 B中的150万行也出现在A中。我想要这两个RDD之间的设置差异,这样我返回A有300,000,000行,而B中的那些1,500,000行不再出现在A中。
我无法使用Spark DataFrames。
这是我现在使用的系统。这些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时,这是不成功的。是否有更好(更平行)的方法来实现它?
答案 0 :(得分:4)
这似乎是您可以使用subtractByKey
val filteredA = a.subtractByKey(b)
要更改为键值:
val keyValRDD = rdd.map(lambda x: (x[:1],x[1:]))
*请注意,我的python很弱,可能有更好的方法来分割值