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



我对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. 错误:Numeric[V]不接受类型参数

这些我不明白。我不会在任何地方将类型参数传递给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的隐式值"的错误。

好的,所以我解决了问题

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)
  }

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

最新更新