Kat*_*ler 3 python set-difference apache-spark rdd
我有两个 spark RDD,A 有 301,500,000 行,B 有 1,500,000 行。B 中的那 150 万行也都出现在 A 中。我想要这两个 RDD 之间的设置差异,以便我返回包含 300,000,000 行的 A,而来自 B 的那 1,500,000 行不再存在于 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)
Run Code Online (Sandbox Code Playgroud)
现在,这适用于这个示例问题,因为 A 和 B 很小。但是,当我使用真实数据集 A 和 B 时,这是不成功的。有没有更好(更并行)的方法来实现这一点?
这似乎是你可以解决的问题 subtractByKey
val filteredA = a.subtractByKey(b)
Run Code Online (Sandbox Code Playgroud)
要更改为键值:
val keyValRDD = rdd.map(lambda x: (x[:1],x[1:]))
Run Code Online (Sandbox Code Playgroud)
*请注意,我的 python 很弱,可能有更好的方法来拆分值
| 归档时间: |
|
| 查看次数: |
3553 次 |
| 最近记录: |