2015-06-23 56 views
3

最近我被問到(在課堂作業中)是否可以找到RDD內出現的前10個詞。我提交了一份工作解決方案,看起來像用於元組RDD的SortByValue

wordsRdd 
    .map(x => (x, 1)) 
    .reduceByKey(_ + _) 
    .map(case (x, y) => (y, x)) 
    .sortByKey(false) 
    .map(case (x, y) => (y, x)) 
    .take(10) 

所以基本上,我交換元組,按鍵排序,然後再次交換。然後終於拿到10.我沒有發現重複交換非常優雅。

所以我不知道是否有一個更優雅的方式來做到這一點。

我搜查,發現使用Scala的implicits到RDD轉換爲斯卡拉序列,然後做sortByValue一些人,但我不想RDD轉換爲斯卡拉Seq,因爲這將殺死的分佈式特性RDD。

那麼還有更好的方法嗎?

+0

「最近有人問我找到頂級的10中發生內部RDD話」是啊,沒錯,「賦值爲我的課程問......「也許? –

+1

是的。這是一項任務。我完成了它,結果如上所示。我不是要求任何人完成任務。我正在問如何改進已被接受爲有效且正確的答案。但我覺得可以有更好的辦法。 –

+0

好的。值得說的是,或者你看起來像是在尋找SO來回答你的任務 –

回答

3

如何:

wordsRdd. 
    map(x => (x, 1)). 
    reduceByKey(_ + _). 
    takeOrdered(10)(Ordering.by(-1 * _._2)) 

還是有點冗長:

object WordCountPairsOrdering extends Ordering[(String, Int)] { 
    def compare(a: (String, Int), b: (String, Int)) = b._2.compare(a._2) 
} 

wordsRdd. 
    map(x => (x, 1)). 
    reduceByKey(_ + _). 
    takeOrdered(10)(WordCountPairsOrdering) 
+0

是的。這比我的解決方案好得多。因爲你正在排序一次而不是交換,排序然後交換。謝謝! –