加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – AggregateByKey在抽象类中时无法编译

发布时间:2020-12-16 10:01:05 所属栏目:安全 来源:网络整理
导读:我是 Scala和Spark的新手,所以我希望有人可以解释为什么aggregateByKey在抽象类中时无法编译.这是我能提出的最简单的例子: import org.apache.spark.{SparkConf,SparkContext}import org.apache.spark.rdd.RDDabstract class AbstractKeyCounter[K] { def k
我是 Scala和Spark的新手,所以我希望有人可以解释为什么aggregateByKey在抽象类中时无法编译.这是我能提出的最简单的例子:

import org.apache.spark.{SparkConf,SparkContext}
import org.apache.spark.rdd.RDD

abstract class AbstractKeyCounter[K] {

  def keyValPairs(): RDD[(K,String)]

  def processData(): RDD[(K,Int)] = {
    keyValPairs().aggregateByKey(0)(
      (count,key) => count + 1,(count1,count2) => count1 + count2
    )
  }

}

class StringKeyCounter extends AbstractKeyCounter[String] {

  override def keyValPairs(): RDD[(String,String)] = {
    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("counter"))
    val data = sc.parallelize(Array("foo=A","foo=A","foo=B","bar=C","bar=D","bar=D"))
    data.map(_.split("=")).map(v => (v(0),v(1)))
  }

}

这使:

Error:(11,19) value aggregateByKey is not a member of org.apache.spark.rdd.RDD[(K,String)]
    keyValPairs().aggregateByKey(0)(
                  ^

如果我改为使用单个具体类,它将编译并成功运行:

import org.apache.spark.{SparkConf,SparkContext}
import org.apache.spark.rdd.RDD

class StringKeyCounter {

  def processData(): RDD[(String,Int)] = {
    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("counter"))
    val data = sc.parallelize(Array("foo=A","bar=D"))
    val keyValPairs = data.map(_.split("=")).map(v => (v(0),v(1)))

    keyValPairs.aggregateByKey(0)(
      (count,count2) => count1 + count2
    )
  }

}

我错过了什么?

解决方法

如果你改变:

abstract class AbstractKeyCounter[K] {

至:

abstract class AbstractKeyCounter[K : ClassTag] {

这将编译.

为什么? aggregateByKey是PairRDDFunctions的一种方法(您的RDD被隐式转换为该类),它具有以下签名:

class PairRDDFunctions[K,V](self: RDD[(K,V)])
  (implicit kt: ClassTag[K],vt: ClassTag[V],ord: Ordering[K] = null)

这意味着它的构造函数需要ClassTag [K]和vt:ClassTag [V]类型的隐式值.您的抽象类不知道K是什么,因此无法提供匹配的隐式值.这意味着隐式转换为PairRDDFunctions“失败”(编译器不执行转换),因此无法找到方法aggregateByKey.

添加[K:ClassTag]是将隐式参数隐式kt:ClassTag [K]添加到抽象类构造函数的简写,然后由编译器使用它并传递给PairRDDFunctions的构造函数.

有关ClassTag的更多信息以及它们有用的内容,请参阅this good article.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读