【问题标题】:reduceByKey after mapValues with parameterized type doesn't compile具有参数化类型的 mapValues 后的 reduceByKey 无法编译
【发布时间】:2018-08-30 22:04:03
【问题描述】:

当我调用RDD.mapValues(...).reduceByKey(...) 时,我的代码无法编译。但是当我颠倒顺序时,RDD.reduceByKey(...).mapValues(...),代码确实编译了。类型似乎匹配。

一个完整的最小复制示例是:

def test[E]() =
    new SparkContext().textFile("")
        .keyBy(_ ⇒ 0L)
        .mapValues(_.asInstanceOf[E])
        .reduceByKey((x, _) ⇒ x)

编译错误与this question 中的相同,但其补救措施没有帮助:

Test.scala:7: error: value reduceByKey is not a member of org.apache.spark.rdd.RDD[(Long, E)]
possible cause: maybe a semicolon is missing before `value reduceByKey'?
            .reduceByKey((x, _) ⇒ x)

这个问题似乎比 Spark 更多地出现在 Scala 级别。用 Int 替换类型参数是可行的,因此它可能是类型推断的问题。我将 Spark 2.2.0 与 Scala 2.11 一起使用。

【问题讨论】:

    标签: scala apache-spark type-inference


    【解决方案1】:

    诸如.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]
    

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

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

    或简写:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-28
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多