2016-02-05 24 views
1

我使用apache-spark和scala通過參數聚合值如下。 這不斷增加值到「列表」 是否有更有效的方式來獲得關鍵和StatCounter列表?通過鍵和StatCounter進行高效的分組

val predictorRawKey = predictorRaw.map { x => 
     val param = x._1 
     val val: Double = x._2.toDouble 
     (param, val) 
    }.mapValues(num => List(num)) 
    .reduceByKey((l1, l2) => l1 ::: l2) 
    .map { x => x._1, StatCounter(x._2.iterator)) 

回答

1

對於初學者,您不應該使用reduceByKey來分組值。直接使用groupByKey省略地圖側彙總效率更高。

幸運StatCounter可以以流方式工作,沒有必要到組值都:

import org.apache.spark.util.StatCounter 

val pairs = predictorRawKey.map(x => (x._1, x._2.toDouble)) 

val predictorRawKey = pairs.aggregateByKey(StatCounter(Nil))(
    (acc: StatCounter, x: Double) => acc.merge(x), 
    (acc1: StatCounter, acc2: StatCounter) => acc1.merge(acc2) 
) 
+0

哦,我真的很感激! – joshsuihn

+0

我認爲reduceByKey在內部已經具有像(acc,x)=> acc.merge(x)這樣的操作。您能否簡單介紹一下reduceByKey和aggregateByKey之間的區別。通常,我們可以說aggregateByKey更高效(如果它穩定且快速,我會說「高效」)謝謝! – joshsuihn

+1

這完全是關於類型。 'pairs'爲'RDD [(T,Double)]',predictorRawKey爲'RDD [(T,StatCounter)]'。由於類型不匹配,因此不能使用'reduceByKey'。你可以把''pairs'映射到'RDD [(T,StatCounter)]'和'reduceByKey',但是沒有理由創建大量的臨時對象。 – zero323

相關問題