我正尝试在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)
我一直在试图弄清楚我们的问题,但是对错误的解释却非常困难。
我怀疑问题来自合并器还是合并方法。
您能帮我解决问题吗?
谢谢
答案 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
,显然不能满足这个 。
让实际的实现作为练习留给用户-因为问题似乎很接近家庭作业。