value reduceByKey不是org.apache.spark.rdd.RDD的成员

时间:2017-08-10 18:13:55

标签: scala generics apache-spark rdd traits

非常难过。我的火花版本是2.1.1,Scala版本是2.11

import org.apache.spark.SparkContext._
import com.mufu.wcsa.component.dimension.{DimensionKey, KeyTrait}
import com.mufu.wcsa.log.LogRecord
import org.apache.spark.rdd.RDD

object PV {

//
  def stat[C <: LogRecord,K <:DimensionKey](statTrait: KeyTrait[C ,K],logRecords: RDD[C]): RDD[(K,Int)] = {
    val t = logRecords.map(record =>(statTrait.getKey(record),1)).reduceByKey((x,y) => x + y)

我收到了这个错误

at 1502387780429
[ERROR] /Users/lemanli/work/project/newcma/wcsa/wcsa_my/wcsavistor/src/main/scala/com/mufu/wcsa/component/stat/PV.scala:25: error: value reduceByKey is not a member of org.apache.spark.rdd.RDD[(K, Int)]
[ERROR]     val t = logRecords.map(record =>(statTrait.getKey(record),1)).reduceByKey((x,y) => x + y)

定义了一个特征

trait KeyTrait[C <: LogRecord,K <: DimensionKey]{
  def getKey(c:C):K
}
  

编译完毕,谢谢。

 def stat[C <: LogRecord,K <:DimensionKey : ClassTag : Ordering](statTrait: KeyTrait[C ,K],logRecords: RDD[C]): RDD[(K,Int)] = {
    val t = logRecords.map(record =>(statTrait.getKey(record),1)).reduceByKey((x,y) => x + y)

需要覆盖Ordering [T]。

  object ClientStat extends KeyTrait[DetailLogRecord, ClientStat] {
      implicit val c

lientStatSorting = new Ordering[ClientStat] {
    override def compare(x: ClientStat, y: ClientStat): Int = x.key.compare(y.key)
  }

      def getKey(detailLogRecord: DetailLogRecord): ClientStat = new ClientStat(detailLogRecord)
    }

2 个答案:

答案 0 :(得分:5)

这通常来自使用一对rdd函数。 reduceByKey方法实际上是PairRDDFunctions类的一种方法,它具有RDD的隐式转换:

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

因此它需要几个隐式类型类。通常在处理简单的混凝土类型时,这些已经在范围内。但是你应该能够修改你的方法,也需要相同的含义:

def stat[C <: LogRecord,K <:DimensionKey](statTrait: KeyTrait[C ,K],logRecords: RDD[C])(implicit kt: ClassTag[K], ord: Ordering[K])

或使用较新的语法:

def stat[C <: LogRecord,K <:DimensionKey : ClassTag : Ordering](statTrait: KeyTrait[C ,K],logRecords: RDD[C])

答案 1 :(得分:3)

reduceByKey是一种仅在元组的RDD上定义的方法,即RDD[(K, V)](K,V只是一个约定,即第一个是关键的第二个是值)。

从示例中不确定您要实现的目标,但肯定需要将RDD中的值转换为两个值的元组。