以下是命令:
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)
任何人都知道为什么我们需要给出两个括号(())。
答案 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)(...)
分别有两个Int
和Double
类型的参数。它与签名不符。