当我写这样的特质时:
trait Extractor[T] {
def parse(sc: SparkContext, path: String): RDD[T]
def extract(sc: SparkContext, path: String, output: String): Unit = {
val rdd = parse(sc, path)
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._
SaveUtil.saveAsOrc(rdd.toDF(), output) // error
}
}我想指定一个案例类的通用T:
case class X(uid: String, app: String, tag: String)
case class Y(uid: String, dvc: String, tag: String)我是斯卡拉的新手。隐式转换和协变量似乎不起作用。多么?
发布于 2016-04-09 19:08:17
RDD.toDF()的存在得益于将其隐式转换为DataFrameHolder。此转换由具有以下签名的方法完成:
implicit def rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A]): DataFrameHolder因此-转换为工作:
T必须是Product的子类,它是所有案例类(以及元组等)的超类。TypeTag具有隐式T (以克服类型擦除)所以-你基本上想要改变你的特征声明如下:
// won't work...
trait Extractor[T <: Product : TypeTag] { /* unchanged */ }但是,这些特性不能有具有上下文/视图边界的类型,因此这个声明将无法工作。在这里你有两个选择:
TypeTag:
抽象类ExtractorT <:积: TypeTag { /*不变*/ }extract方法添加一个隐式参数:
特质ExtractorT <:产品{ def解析(sc: SparkContext,path: String):RDDT def提取(sc: SparkContext,path: String,output: String)(隐式证据: TypeTagT):TypeTagT={ /*未更改*}发布于 2016-04-09 03:47:26
object ExtractorX extends Extractor[X] {
override parse(sc: SparkContext, path: String): RDD[X] = ...
}或
val extractorX = new Extractor[X] {
override parse(sc: SparkContext, path: String): RDD[X] = ...
}https://stackoverflow.com/questions/36512308
复制相似问题