2016-09-16 26 views
0

我無法理解類似sortByKey的函數可以調用的集合的數據類型。我有一個ListMap(我想要一個按順序存儲元素的數據結構),我想調用sortByKey。列表圖的內容是前n個鍵作爲鍵,1個作爲每個鍵的值。我應該用什麼來代替列表圖?在spark中使用OrderedRDD函數

val l = (1 to 1000).toList 
val d = ListMap(l.map(s=> s -> 1):_*) 
val rdd = sc.parallelize(Seq(d)) 
rdd.collect() 
val sorted = rdd.sortByKey() 
sorted.collect() 

回答

0

你不需要ListMap。所有你需要的是一個RDD具有鍵和值的潛在元組,在RDD[(K, V)]形式,其中你的情況,我們有一個RDD[(Int, Int)]

val rdd: RDD[(Int, Int)] = sc.parallelize((1 to 1000).map(k => (k -> 1)).toSeq) 

rdd.sortByKey().collect() 

您還需要一個Ordering,您目前可以免費獲得,隱含地,對於類型爲Int的原語。

+0

工作!我正在使用一個ListMap,因爲我想確保鍵被排序,所以我對排序函數的輸入已經排序。我如何確保這個rdd在傳遞給排序函數時是有序的。 – user1745995

+0

@user你爲什麼要分類排序的東西?不知道我跟着。 –

+0

我想要隨機讀取和隨機寫入,因爲我希望數據在網絡中移動。但我不想花時間做一個實際的排序(實際上,我甚至不關心我的最終數據沒有排序)。據我所知,spark使用tim排序,它給出了排序數據的O(n)運行時間,所以我想確保我想要排序的數據是排序的。 – user1745995

0

Spark programming guide

sortByKey([升序],[numTasks])

當稱爲上的數據集(K,V)對其中K器具有序, 返回一個(K,V)對的數據集按升序或 降序排序,如布爾升序參數中所指定。

所以你需要一個PairRDD鑰匙可以訂購,請參閱其他答案的例子。

1

的要求很簡單:

  • 你需要一個RDD[(K, V)]
  • 存在於給定範圍內的K必須有implicitOrdering

你的例子並沒有什麼意義,因爲你創建的RDD只有一個元素,所以沒有什麼可以排序。也許你想這樣的事情:

sc.range(1, 1001).map((_, 1)).sortByKey() 
+0

我試過了,它的工作原理。謝謝!我的代碼片段中的哪一部分僅使它成爲一個元素?我想確保鍵已經排序,以便排序算法是O(n)確實按照順序存儲的rdd中的結果。 – user1745995

+0

'Seq(d)'。你可以用'd.toSeq'代替它,但這是很有意義的。 – zero323