将Spark reduceByKey应用于具有上下文边界的泛型

时间:2016-05-13 14:08:48

标签: scala apache-spark

我仍然是Scala中上下文边界的新手,我正在尝试编写一个函数,可以对任何满足上下文绑定的泛型执行reduceByKey。 例如

def myReduce[K: ClassTag, V: ClassTag: Numeric[V]](in: RDD[(K, V)]): RDD[(K, V)] = {
  in.reduceByKey{case (v1, v2) =>
    implicityly[Numeric[V]].plus(v1, v2)
  }

据我所知,这应该可行但是在尝试编译时我会遇到以下错误。

  1. 错误:找不到参数e:Numeric
  2. 的隐含值
  3. 错误:数字[V]不接受类型参数
  4. 这些我不明白。 我没有在任何地方将类型参数传递给Numeric [V]。上下文绑定也不应自动导入转换的“证据”吗?

    我希望最终能够使用我自己的特性而不是数字。

    编辑:

    我尝试在函数中明确写出隐含的evdience,如下所示:

    def myReduce[K: ClassTag, V: ClassTag](in: RDD[(K, V)])(implicit ev: V => Numeric[V]): RDD[(K, V)] = {
      in.reduceByKey{case (v1, v2) =>
        implicityly[Numeric[V]].plus(v1, v2)
      }
    

    但我仍然得到“错误:无法找到参数e:Numeric的隐含值”错误。

1 个答案:

答案 0 :(得分:1)

好的,我解决了这个问题

def myReduce[K: ClassTag, V: ClassTag: Numeric](in: RDD[(K, V)]): RDD[(K, V)] = {
  in.reduceByKey{case (v1, v2) =>
    implicityly[Numeric[V]].plus(v1, v2)
  }

问题是指定数字[V]而不仅仅是数字。 我现在遇到了更多问题,但那是另一天。