2017-06-13 147 views
0

我試圖從排序的RDD [字符串]中提取一些元素。我嘗試使用「zipWithIndex」並將剩餘的RDD過濾爲零。如何將已排序的RDD拆分爲n個部分並從每個部分獲取第一個元素?

val expectedSize = 165 
val n = rddOfStrings.count/expectedSize 

val resultArray = rddOfStrings.sortBy(x => x).zipWithIndex.filter(x => x._2 % n == 0).map(_._1).collect 

這裏的問題是「n」不總是整數。如果它是double,則resultArray的大小不會等於expectedSize(生成+1或-1)。如何使它返回相同大小的集合?

P.S.我通過向所有執行者傳遞集合對象來嘗試spark累加器。由於非常大的數據集失敗。

+0

是什麼你的目標在這裏?這只是爲了從你的數據集中得到一個樣本,spark實際上有一個你可以使用的樣本方法。 – puhlen

+0

我想將rdd(排序)分成165個相等部分,並從每個部分取第一個(頭部)元素。 – sen

回答

0

的165份不能等於,真的 - 他們中的一些會比其他假設總大小不是165

乘法要獲得這些零件「儘可能均勻分佈儘可能」你可以使用一個非舍n,創建一個n, 2n, 3n, ...流,然後在圓該流的每個元素讓你後的元素的索引,然後使用contains過濾RDD:

val expectedSize = 165 
val n: Double = rddOfStrings.count.toDouble/expectedSize 

val indices = Stream.iterate(0D)(x => x + n) 
    .map(math.round) 
    .take(expectedSize) 
    .toList 

val resultArray = rddOfStrings.sortBy(x => x) 
    .zipWithIndex 
    .filter(x => indices.contains(x._2)) 
    .map(_._1) 
    .collect 
+0

完美!就像我想要的一樣... – sen

相關問題