gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:56:53 25 4
gpt4 key购买 nike

我是 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=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", "foo=A", "foo=A", "foo=B", "bar=C", "bar=D", "bar=D"))
val keyValPairs = data.map(_.split("=")).map(v => (v(0), v(1)))

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

}

我错过了什么?

最佳答案

如果你改变:

abstract class AbstractKeyCounter[K] {

到:
abstract class AbstractKeyCounter[K : ClassTag] {

这将编译。

为什么 ? aggregateByKeyPairRDDFunctions的方法(您的 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]是添加隐式参数的简写 implicit kt: ClassTag[K]到抽象类构造函数,然后由编译器使用并传递给 PairRDDFunctions 的构造函数.

有关 ClassTag 及其用途的更多信息,请参阅 this good article .

关于scala - AggregateByKey 在抽象类中时无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39943600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com