2016-10-22 76 views
3

後我有一個數據集,看起來像下面 -火花 - Scala的:返回多個<key, value>處理一行

0 - 1,2,4-
1 - 0,4
2 - 0, 4
4 - 2,1,0

我想讀的每一行,並把它轉換爲的東西,看起來像下面

//爲線0 - 1,2,4
(0,1)< 2,4>
(0,2)< 1,4>
(0,4)< 1,2->

//爲線路1 - 0, 4
(0,1)< 4>
(1,4)< 0>

//較小數目的第一appeears在一對總是

即,讀每一行上分離「 - 「分隔符。所以我從數據集的第1行得到0和1,2,4。之後,我想創建對。例如,(0,1)將是變換映射的關鍵,它的值應該是2,4。

一旦做到這一點,我希望能夠對值進行分組通過鍵

例如(0,1)< 2,4> < 4>

和相交他們得到4.

是否有可能做到這樣的事情?我的方法是對的嗎?

我已經寫了下面的代碼,使遠

var mapOperation = logData.map(x=>x.split("\t")).filter(x => x.length == 2).map(x => (x(0),x(1))) 
// reading file and creating the map Example - key 0 value 1,2,4 

//from the first map, trying to create pairs 
var mapAgainstValue = mapOperation.map{ 
line => 
val fromFriend = line._1 
val toFriendsList = line._2.split(",") 
(fromFriend -> toFriendsList) 
} 

val newMap = mapAgainstValue.map{ 
line => 
var key =""; 
for(userIds <- line._2){ 
key =line._1.concat(","+userIds); 
(key -> line._2.toList) 
} 

} 

的問題是我不能夠調用groupByKey上newMap。我假設我創建地圖的方式存在一些問題?

感謝任何幫助。

謝謝。

+0

請編輯問題並添加一些細節,因爲我無法弄清楚你真的想要什麼 –

+0

我編輯了問題。希望比以前更好。 – maddie

回答

6

你的問題是可以解決這樣的:

val inputRDD=sc.textFile("inputFile.txt") 
inputRDD.flatMap{a=> 
      val list=a.split("--") 
      val firstTerm=list(0) 
      val secondTermAsList=list(1).split(",") 
      secondTermAsList.map{b=> 
      val key=if(b>firstTerm) (firstTerm,b) else (b,firstTerm) 
      val value=secondTermAsList diff List(b) 
      (key,value) 
      } 
      } 

該代碼產生這樣的輸出:

+-----+------+ 
|_1 |_2 | 
+-----+------+ 
|[0,1]|[2, 4]| 
|[0,2]|[1, 4]| 
|[0,4]|[1, 2]| 
|[0,1]|[4] | 
|[1,4]|[0] | 
|[0,2]|[4] | 
|[2,4]|[0] | 
|[2,4]|[1, 0]| 
|[1,4]|[2, 0]| 
|[0,4]|[2, 1]| 
+-----+------+ 

我希望這能解決您的問題!

+0

這是一段真正優秀的代碼。非常感謝。所以,從這裏開始,我應該能夠通過鍵來完成一個組並且相交這些值集。 – maddie

+0

還有一件事,如果不是數據集中的每個元素在分隔符後都有值,我應該在哪裏添加過濾器? – maddie

+0

檢查分隔後的列表大小是否爲1。如果它只是給出默認值或者進行計算 –