具有参数化类型的mapValues之后的reduceByKey不会编译

时间:2018-03-21 16:50:18

标签: scala apache-spark type-inference

当我调用ex.com/read?id=1 时,我的代码无法编译。但是当我颠倒顺序ex.com/route.php?action=read&id=1 时,代码编译。类型似乎匹配。

完整的最小复制示例是:

RDD.mapValues(...).reduceByKey(...)

编译错误与this question中的相同,但其补救措施无效:

RDD.reduceByKey(...).mapValues(...)

这个问题在Scala级别似乎比Spark更多。用Int替换type参数可能会导致类型推断出现问题。我使用Spark 2.2.0和Scala 2.11。

1 个答案:

答案 0 :(得分:2)

.reduceByKey.mapValues等方法是PairRDDFunctions的成员,但您可以调用它们,因为RDD[(K, V)]存在隐式转换。但是,如果仔细查看转换的定义,您可能会发现问题:

implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)])
    (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null): PairRDDFunctions[K, V]

ClassTagK类型需要V个实例。在您的示例中,E没有可用的内容,因此无法应用隐式转换,因此它无法找到reduceByKey方法。试试这个:

def test[E]()(implicit et: ClassTag[E]) = ...

或简写:

def test[E : ClassTag]() = ...