blu*_*sky 2 scala apache-spark rdd
在下面的代码中,我试图组合值:
val rdd: org.apache.spark.rdd.RDD[((String), Double)] =
sc.parallelize(List(
(("a"), 1.0),
(("a"), 3.0),
(("a"), 2.0)
))
val reduceByKey = rdd.reduceByKey((a , b) => String.valueOf(a) + String.valueOf(b))
Run Code Online (Sandbox Code Playgroud)
reduceByValue 应包含(a,1,3,2)但接收编译时错误:
Multiple markers at this line - type mismatch; found : String required: Double - type mismatch; found : String
required: Double
Run Code Online (Sandbox Code Playgroud)
什么决定了reduce函数的类型?这种类型可以转换吗?
我可以groupByKey用来达到相同的结果,但只是想了解reduceByKey.
不,给定rdd类型RDD[(K,V)],reduceByKey将采用类型的关联函数(V,V) => V.
如果我们想要应用将值的类型更改为另一个任意类型的减少,那么我们可以使用aggregateByKey:
def aggregateByKey[U](zeroValue: U)(seqOp: (U, V) ? U, combOp: (U, U) ? U)
Run Code Online (Sandbox Code Playgroud)
使用zeroValue和seqOp函数,它在地图侧提供类似折叠的操作,而关联函数combOp将结果seqOp与最终结果相结合,就像reduceByKey那样.正如我们可以从签名中理解的那样,虽然集合值是类型,V但结果aggregateByKey将是任意类型U
应用于上面的示例, aggregateByKey看起来像这样:
rdd.aggregateByKey("")({case (aggr , value) => aggr + String.valueOf(value)}, (aggr1, aggr2) => aggr1 + aggr2)
Run Code Online (Sandbox Code Playgroud)