当我调用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。
答案 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]
ClassTag
和K
类型需要V
个实例。在您的示例中,E
没有可用的内容,因此无法应用隐式转换,因此它无法找到reduceByKey
方法。试试这个:
def test[E]()(implicit et: ClassTag[E]) = ...
或简写:
def test[E : ClassTag]() = ...