2016-11-22 125 views
0

我有一些與subtractByKey有關的問題。spark:subtractByKey問題(pyspark)

我有2個文件: 第一個是這樣的:(客戶端ID +客戶端郵件)

client_id emails 

4A85FD8E-197D-2AE3-B939-A527AFF16A04 [email protected]***tur.com 
D48D530C-CF68-DAF1-18F0-E0A0A03F3E06 [email protected]***ncus.net:[email protected]****m.ca 
40815230-25DC-9EA0-01D1-2706B4B56958 [email protected]****nc.net 
... 

,而第二個:(僅郵件)

[email protected]****s.com 
[email protected]****m.org 
[email protected]****e.edu 
.... 

一些第一個文件中的行可以具有2(或更多)這種格式的郵件:

mail:mail 

我做了什麼:

*test1=sc.textFile("file1") 
*test2=sc.textFile("file2") 
*test3=test1.subtractByKey(test2) 

,其結果是...:

[(u'A', u'B'), (u'A', u'D'), (u'A', u'1'), (u'A', u'D'), (u'A', u'D'), (u'A', u'B'), (u'A', u'F'), (u'A', u'E'), (u'A', u'9'), (u'A', u'5'), (u'A', u'9'), (u'A', u'6'), (u'c', u'l'), (u'E', u'8'), (u'E', u'4'), (u'E', u'6'), (u'E', u'6'), (u'E', u'7'), (u'E', u'5'), (u'E', u'5'), (u'E', u'5'), (u'E', u'2'), (u'E', u'8'), (u'C', u'2'), (u'C', u'5'), (u'C', u'6'), (u'C', u'C'), (u'C', u'E'), (u'C', u'3'), (u'C', u'F'), (u'C', u'4'), (u'C', u'B'), (u'C', u'F'), (u'C', u'F'), (u'C', u'8'), (u'C', u'0'), (u'1', u'D'), (u'1', u'2'), (u'1', u'3'), (u'1', u'8'), (u'1', u'0'), (u'1', u'F'), ... ] 

我想刪除的客戶誰在第二個文件有他們的郵件的第一個文件,但它不起作用。

+0

你最好以'代碼'格式編輯你的問題,因爲我看到的是很混亂 – armnotstrong

+0

它沒有代碼...除了3行代碼格式。 – Ezay

+0

這是第一個可能包含多個電子郵件的文件,對嗎? – armnotstrong

回答

0

注:我不是很熟悉pyspark但火花API應該是 相同。

首先,您應電子郵件爲重點

rdd1=sc.textFile("file1").map(lambda line: (line.split(" ")[0], line.split(" ")[1]))

這會給你的

[(4A85FD8E-197D-2AE3-B939-A527AFF16A04,[email protected]***tur.com)] 

然後RDD因爲可能會有多郵件,你應該做一個flatMapValues()

rdd2 = rdd1.flatMapValues(lambda email: email.split(":"))

這會給你一雙RDD,每一個只包含一個電子郵件

現在你可以切換

rdd3=rdd2.map(lambda kv: (kv[1], kv[0])) 

現在你會得到一個RDD鍵和值,使用用戶的電子郵件作爲主要的和UUID作爲一個值,如

[([email protected]***tur.com, 4A85FD8E-197D-2AE3-B939-A527AFF16A04)] 

現在你應該找哪家UUID的電子郵件中包含文件2,要做到這一點,你應該加載第二個文件作爲RDD :

secondRdd = sc.textFile("file2").map(lambda line: (line, 1)) 

並做一個join並調整連接結果rdd。

rdd4 = rdd3.join(secondRdd).map(lambda kv: (kv[1][0], kv[0])) 

如果一切是正確的,現在你應該得到一個RDD是作爲(UUID, email)的格式,它代表所有其電子郵件出現在file2用戶,

那麼你可以做一個subtractByKey()rdd1是我們最初得到。

+0

好,非常感謝。如果我可以添加一個問題:如果電子郵件位於file2中,它將刪除客戶端。好的,但如果客戶有2封郵件,它是否會刪除其中一個或兩個郵件? (我猜你的平板地圖是否重複客戶端?) – Ezay

+0

你應該注意到,'rdd1'還沒有flatMap呢,是的,我想如果有重複'UUID','subtractByKey()'會[全部緩解]( https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html#tbl-pair-two-transformations) – armnotstrong