Scala 按密钥和StatCounter进行有效分组
我使用ApacheSpark和scala按参数聚合值,如下所示。 这会不断向“列表”中添加值 是否有更有效的方法通过键和StatCounter获取列表Scala 按密钥和StatCounter进行有效分组,scala,apache-spark,Scala,Apache Spark,我使用ApacheSpark和scala按参数聚合值,如下所示。 这会不断向“列表”中添加值 是否有更有效的方法通过键和StatCounter获取列表 val predictorRawKey = predictorRaw.map { x => val param = x._1 val val: Double = x._2.toDouble (param, val) }.mapValues(num => List( num) ) .
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))
首先,您不应该使用
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)
)
哦,我真的很感激!我认为reduceByKey内部已经有了类似(acc,x)=>acc.merge(x)的操作。您能简要解释一下reduceByKey和aggregateByKey之间的区别吗。一般来说,我们可以说aggregateByKey更高效(如果它稳定且快速,我会说“高效”),谢谢!这都是关于类型的<代码>配对is
RDD[(T,Double)]
和predictrawkey
isRDD[(T,StatCounter)]
。由于类型不匹配,因此不能使用reduceByKey
。您可以将对映射到RDD[(T,StatCounter)]
和reduceByKey
,但没有理由创建大量临时对象。