2016-12-17 38 views
3

我正在學習Spark + Scala,並且我被這個問題困住了。我有兩件事。包含許多字一個文件(我告訴你,例如2個第一行):斯卡拉Spark rdd組合在一個文件中匹配對

scala> val text = sc.textFile("hdfs://master:9000/data/words.txt") 
text: org.apache.spark.rdd.RDD[String] = hdfs://master:9000/data/words.txt MapPartitionsRDD[1] at textFile at <console>:24 

scala> text.take(2) 
res0: Array[String] = Array("a b c d ", "e r t y u i o p ") 

而且我有一個「組合」變量代表對頻繁出現的詞彙(我告訴你,例如2第一行):

scala> val combinations = l.cartesian(l).filter{case(x,y) => x < y} 
combinations: org.apache.spark.rdd.RDD[(String, String)] = MapPartitionsRDD[9] at filter at <console>:32 

scala> combinations.take(2) 
res1: Array[(String, String)] = Array((a,b), (a,c)) 

我想從「文本」 varable的每一行創造組合對,以與「組合」變量對匹配它們。

例如,在輸入文本的第一行,我想有:

(a,b) (a,c) (a,d) (b,c) (b,d) (c,d) 

,這樣我可以用「組合」變量相匹配他們

請幫幫忙!這真讓我抓狂。謝謝,

回答

4

如果我理解正確,我們希望得到每個條目text中包含的字母的組合。例如:

"a b c d " => (a,b) (a,c) (a,d) (b,c) (b,d) (c,d) 

我們可以使用Scala集合API做到這一點:

val textCombinations = text.map(t => t.split(" ").combinations(2).toList) 
+0

你好maasg,你的代碼似乎是好的,但我有: – Bebec

+0

斯卡拉> textCombinations.take(10).foreach (println) 16/12/17 11:45:42 ERROR executor.Executor:階段5.0(TID 5)中任務0.0中的異常 java.io.NotSerializableException:scala.collection.SeqLike $ CombinationsItr 序列化堆棧:.. 。 – Bebec

+0

@Bebec我明白了。使它成爲'.combinations(2).toList'而不是'.toSeq'。看起來'toSeq'實現默認爲不可序列化的'Stream'。我也更新了答案。 – maasg