とても悲しいです。私の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)
}
これは、一般的にペア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])
reduceByKey
は、タプルのRDDでのみ定義されるメソッドです。つまり、RDD[(K, V)]
(K、Vは、最初がキー、2番目が値であると言う慣習です)。
何を達成しようとしているのかは例からはわかりませんが、RDD内の値を2つの値のタプルに変換する必要があることは確かです。