【问题标题】:value reduceByKey is not a member of org.apache.spark.rdd.RDD值 reduceByKey 不是 org.apache.spark.rdd.RDD 的成员
【发布时间】:2017-11-24 15:31:36
【问题描述】:

很伤心。我的spark版本是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)
    }

【问题讨论】:

    标签: scala generics apache-spark rdd traits


    【解决方案1】:

    这来自于一般使用 pair 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])
    

    【讨论】:

      【解决方案2】:

      reduceByKey 是一种仅在元组的 RDD 上定义的方法,即RDD[(K, V)](K,V 只是约定,首先是键,其次是值)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        • 2017-11-19
        • 2016-02-15
        • 2016-05-20
        • 2018-03-27
        • 1970-01-01
        相关资源
        最近更新 更多