lem*_*nli 6 generics scala traits apache-spark 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)
Run Code Online (Sandbox Code Playgroud)
我得到这个错误
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)
Run Code Online (Sandbox Code Playgroud)
有一个特质
trait KeyTrait[C <: LogRecord,K <: DimensionKey]{
def getKey(c:C):K
}
Run Code Online (Sandbox Code Playgroud)
编译,谢谢。
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)
Run Code Online (Sandbox Code Playgroud)
密钥需要覆盖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)
}
Run Code Online (Sandbox Code Playgroud)
这来自一般使用对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]
Run Code Online (Sandbox Code Playgroud)
因此,它需要几个隐式类型类。通常,当使用简单的具体类型时,这些已经在范围内。但是您应该能够修改方法,使其也需要相同的隐式:
def stat[C <: LogRecord,K <:DimensionKey](statTrait: KeyTrait[C ,K],logRecords: RDD[C])(implicit kt: ClassTag[K], ord: Ordering[K])
Run Code Online (Sandbox Code Playgroud)
或使用更新的语法:
def stat[C <: LogRecord,K <:DimensionKey : ClassTag : Ordering](statTrait: KeyTrait[C ,K],logRecords: RDD[C])
Run Code Online (Sandbox Code Playgroud)
reduceByKey
是一种仅在元组的 RDD 上定义的方法,即RDD[(K, V)]
(K,V 只是一个约定,表示第一个是键,第二个是值)。
从示例中不确定您要实现的目标,但可以肯定的是,您需要将 RDD 中的值转换为两个值的元组。