使用3个元素元组时,为什么会出现CombineByKey错误?

时间:2019-03-07 13:26:22

标签: scala apache-spark

我正尝试在Scala上工作,以便计算有关我的数据的一些统计信息。 我有一个元组数组

agency_time_map = Array(("LA", 2), ("NY", 4), ...)

我正在尝试使用CombineByKey:

val combiner = (x: Double) => (1, x, x*x)

val merger = (x: (Int, Double, Double), y: (Double, Double)) => {
    val (c, acc_1, acc_2) = x
    val (y_1, y_2) = y
    (c+1, acc_1 + y_1, acc_2 + y_2)
}

val mergeAndCombiner = (x1: (Int, Double, Double), x2: (Int, Double, Double)) => {
    val (c1, acc1_1, acc1_2) = x1
    val (c2, acc2_1, acc2_2) = x2
    (c1+c2, acc1_1 + acc2_1, acc1_2 + acc2_2)
}

在我的数据上使用它时出现以下错误:

agency_time_map.combineByKey(combiner,merger,mergeAndCombiner)

<console>:32: error: type mismatch;
 found   : ((Int, Double, Double), (Double, Double)) => (Int, Double, Double)
 required: (?, Double) => ?
       agency_time_map.combineByKey(combiner,merger,mergeAndCombiner)

我一直在试图弄清楚我们的问题,但是对错误的解释却非常困难。

我怀疑问题来自合并器还是合并方法。

您能帮我解决问题吗?

谢谢

1 个答案:

答案 0 :(得分:0)

那是因为signature of combine by key, define in context of RDD[(K, V)] is

  

def combineByKey[C](createCombiner: (V) ⇒ C, mergeValue: (C, V) ⇒ C, mergeCombiners: (C, C) ⇒ C): RDD[(K, C)]

这意味着mergeValue-V的第二个参数的类型

mergeValue: (C, V) ⇒ C

必须匹配第二个参数类型和createCombiner的参数类型。

如果createCombiner被定义为

val combiner = (x: Double) => (1, x, x*x)

(Double) => (Int, Double Double),然后mergeValue必须是:

(C, Double) => C

其中C(Int, Double Double)-返回类型createCombiner

如果createCombiner如代码中的(C, (Double, Double)) => C,显然不能满足这个

让实际的实现作为练习留给用户-因为问题似乎很接近家庭作业。