spark scala中aggregateByKey的语法

时间:2016-12-10 13:37:23

标签: scala apache-spark

以下是命令:

orderItems.join(orders)
  .map(x =>((x.2.2.split(",")(1),x.1),x.2.1.split(",")(4).toFloat))
  .reduceByKey(+)
  .map(x => (x.1.1,x.2))
  .aggregateByKey((0,0.0))(
    (accu,value) => (accu.1 + 1 , accu.2 + value),
    (value1,value2) => (value1.1 + value2.1,value1.2 + value2.2))

在上面的代码中,如果我们在(0,0.0)方法中提供((0,0.0))来代替aggregateByKey,则会给出以下错误:

  

:25:错误:重载方法值aggregateByKey与替代:   [U](zeroValue:U,numPartitions:Int)(seqOp:(U,Float)=> U,combOp:(U,U)=> U)(隐式证据$ 2:scala.reflect.ClassTag [U] )org.apache.spark.rdd.RDD [(String,U)]   [U](zeroValue:U,partitioner:org.apache.spark.Partitioner)(seqOp:(U,Float)=> U,combOp:(U,U)=> U)(隐式证据$ 1:scala。 reflect.ClassTag [U])org.apache.spark.rdd.RDD [(String,U)]   不能应用于(Int,Double)

任何人都知道为什么我们需要给出两个括号(())。

1 个答案:

答案 0 :(得分:1)

这就是签名的样子:

def aggregateByKey[U](zeroValue: U)(seqOp: (U, V) ⇒ U, combOp: (U, U) ⇒ U)
  • rdd.aggregateByKey((0, 0.0))(...)是一个带有Tuple2[Int, Double]
  • 类型参数的函数调用
  • rdd.aggregateByKey(0, 0.0)(...)分别有两个IntDouble类型的参数。它与签名不符。