Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 按密钥和StatCounter进行有效分组_Scala_Apache Spark - Fatal编程技术网

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) ) .

我使用ApacheSpark和scala按参数聚合值,如下所示。 这会不断向“列表”中添加值 是否有更有效的方法通过键和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))

首先,您不应该使用
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
is
RDD[(T,StatCounter)]
。由于类型不匹配,因此不能使用
reduceByKey
。您可以
映射到
RDD[(T,StatCounter)]
reduceByKey
,但没有理由创建大量临时对象。