web-dev-qa-db-ja.com

値reduceByKeyはorg.Apache.spark.rdd.RDDのメンバーではありません

とても悲しいです。私の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)
    }
6
lemanli

これは、一般的にペア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])
8
Joe K

reduceByKeyは、タプルのRDDでのみ定義されるメソッドです。つまり、RDD[(K, V)](K、Vは、最初がキー、2番目が値であると言う慣習です)。

何を達成しようとしているのかは例からはわかりませんが、RDD内の値を2つの値のタプルに変換する必要があることは確かです。

3
V-Lamp