2017-07-03 93 views
0

仍然是Scala和Spark的初學者,我認爲我只是在這裏毫無頭腦。我有兩個RDDS,類型之一: -如何在兩個單獨的RDD之間映射鍵/值對?

((String, String), Int) = ((" v67430612_serv78i"," fb_201906266952256"),1) 

其他類型的: -

(String, String, String) = (r316079113_serv60i,fb_100007609418328,-795000) 

如可以看出,這兩個RDDS的前兩列是相同的格式。基本上他們是ID,一個是'tid',另一個是'uid'。

問題是這樣的:

是否有通過我可以以這樣的方式,該TID和uid在兩者匹配,並且全部爲相同的匹配ID的數據被顯示在比較這兩個RDDS的方法一行沒有任何重複?

例如:如果我得到一個匹配兩個RDDS

((String, String), Int) = ((" v67430612_serv78i"," fb_201906266952256"),1) 

(String, String, String) = (" v67430612_serv78i"," fb_201906266952256",-795000) 

之間TID和UID的則輸出是: -

((" v67430612_serv78i"," fb_201906266952256",-795000),1) 

兩個RDDS ID是不以任何固定的訂購。它們是隨機的,即在兩個RDD中相同的uid和tid序列號可能不一致。

而且,怎麼會當第一RDD型保持不變,但第二RDD變化鍵入解決方案的變化: -

((String, String, String), Int) = ((daily_reward_android_5.76,fb_193055751144610,81000),1) 

我必須這樣做,而無需使用SQL星火的。

回答

2

我建議你將你的rdds轉換成dataframes,並將join用於簡單。

你的第一個dataframe應該是

+------------------+-------------------+-----+ 
|tid    |uid    |count| 
+------------------+-------------------+-----+ 
| v67430612_serv78i| fb_201906266952256|1 | 
+------------------+-------------------+-----+ 

第二dataframe

+------------------+-------------------+-------+ 
|tid    |uid    |amount | 
+------------------+-------------------+-------+ 
| v67430612_serv78i| fb_201906266952256|-795000| 
+------------------+-------------------+-------+ 

然後得到最終的輸出僅僅是innerjoin作爲

df2.join(df1, Seq("tid", "uid")) 

,這將給輸出

+------------------+-------------------+-------+-----+ 
|tid    |uid    |amount |count| 
+------------------+-------------------+-------+-----+ 
| v67430612_serv78i| fb_201906266952256|-795000|1 | 
+------------------+-------------------+-------+-----+ 

編輯

如果你想這樣做沒有數據幀/火花SQL那麼在RDD方式加入太多,但你將有如下修改

rdd2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2)) 

這將僅在您的問題中定義的rdd1rdd2分別爲((" v67430612_serv78i"," fb_201906266952256"),1)(" v67430612_serv78i"," fb_201906266952256",-795000)時才起作用。 你應該有最終輸出

確保您修剪值空的空間。這將幫助您確保在加入時兩個rdds的鍵值相同,否則您可能會得到空的結果。

+0

爲什麼接受?你想要沒有spark的SQL幫助,不是嗎? –

+0

沒有冒犯!正式的是。但是非正式地講,這也教會了我一些新的東西,因爲我從來沒有單獨使用過SQL,或者之前使用過Spark。這就是接受和贊成的原因。 – PixieDev

+0

我認爲你可以使用RDD map,mapPartitions和join方法來實現你的目標。 – Tom