簡體   English   中英

在Spark Python中對RDD執行設置差異

[英]Perform Set Difference on RDDs in Spark Python

我有兩個火花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時,這是不成功的。是否有更好(更平行)的方法來實現它?

這似乎是你可以使用subtractByKey解決的問題

val filteredA = a.subtractByKey(b)

要更改為鍵值:

val keyValRDD = rdd.map(lambda x: (x[:1],x[1:]))

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM