2017-06-15 57 views
1

我有一個RDD [(字符串,可迭代[WikipediaArticle])]這看起來是這樣的:遍歷CompactBuffer在RDD

(Groovy中,CompactBuffer(WikipediaArticle({有一個字符串冠軍} {有一些文本對應於該標題}),WikipediaArticle({具有字符串標題},{具有對應於該標題一些文本}))以上

大括號只是標題和區分文字,同時使東西更乾淨

的Groovy:是字符串名稱
WikipediaArticle:類有兩個屬性冠軍文本

我需要類型的輸出:List[(String, Int)]其中:
字符串:是第1個要素在RDD這在每行上都是唯一的
在上面的例子中是「Groovy」
Int:是緊湊緩衝區內維基百科文章的計數字符串

我試圖讓事情儘可能清楚,但是,如果您認爲有機會改善問題或者您有任何疑問,請隨時提問。

+0

您正在尋求解決課程任務的方案,這是違反榮譽守則的。你試過什麼了? –

+0

我知道我被卡住了,我也無法從討論部分找到任何幫助。我試圖用map來迭代compactbuffer,但沒有成功。我只需要一點提示我知道我在做一些愚蠢的事情。 –

回答

0

如果對待RDD第(k,v)的一對與所述第一關鍵字是k和CompactBuffer是v的每個元素,一種方法將在下面以使用map具有部分功能case像:

case class WikipediaArticle(title: String, text: String) 

val rdd = sc.parallelize(Seq(
    ("Groovy", Iterable(WikipediaArticle("title1", "text1"), WikipediaArticle("title2", "text2"))), 
    ("nifty", Iterable(WikipediaArticle("title2", "text2"), WikipediaArticle("title3", "text3"))), 
    ("Funny", Iterable(WikipediaArticle("title1", "text1"), WikipediaArticle("title3", "text3"), WikipediaArticle("title4", "text4"))) 
)) 

rdd.map{ case (k, v) => (k, v.size) } 
// res1: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[1] at map at <console>:29 

res1.collect.toList 
// res2: List[(String, Int)] = List((Groovy,2), (nifty,2), (Funny,3)) 
+0

感謝Leo。不幸的是,對於我的情況,這個解決方案不起作用,但是當我這樣做時,它會執行'index.map(k =>(k._1,k._2.iterator.size))。collect()。toList'。我不確定爲什麼它不能像上面所說的那樣把rdd作爲case(k,v)對。不能說清楚錯誤是什麼。 –

+0

@Kireet Bhat,你確定'{}',而不是'()'是否用於包圍'case'部分函數嗎? –

+0

它現在工作!現在,這是全新的。我不知道曲線和圓括號的用法有什麼區別。你知道爲什麼它早些時候不適用於(),但現在用它來做。 –