可以用reduceBykey来改变类型和组合值 - Scala Spark?

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.

maa*_*asg 7

不,给定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)

使用zeroValueseqOp函数,它在地图侧提供类似折叠的操作,而关联函数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)