在scala中,如何指定泛型来扩展case类?
当我写这样一个特征时:在scala中,如何指定泛型来扩展case类?,scala,apache-spark,Scala,Apache Spark,当我写这样一个特征时: 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)
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)
我是scala的新手。隐式转换和协变似乎不起作用。怎么做
object ExtractorX extends Extractor[X] {
override parse(sc: SparkContext, path: String): RDD[X] = ...
}
或
或
RDD.toDF()
的存在得益于隐式转换为DataFrameHolder
。此转换由具有以下签名的进行:
implicit def rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A]): DataFrameHolder
但是,traits不能具有具有上下文/视图边界的类型,因此此声明不起作用。这里有两个选项:
TypeTag
:
abstract class Extractor[T <: Product : TypeTag] { /* unchanged */ }
RDD.toDF()
的存在得益于隐式转换为DataFrameHolder
。此转换由具有以下签名的进行:
implicit def rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A]): DataFrameHolder
但是,traits不能具有具有上下文/视图边界的类型,因此此声明不起作用。这里有两个选项:
TypeTag
:
abstract class Extractor[T <: Product : TypeTag] { /* unchanged */ }
我想重用
extract
代码块,但是toDF()
方法只能应用于RDD[case class]。因此SaveUtil.saveAsOrc(rdd.toDF(),output)
在编译时出错。我想重用extract
代码块,但toDF()
方法只能应用于rdd[case class]。所以SaveUtil.saveAsOrc(rdd.toDF(),output)
在编译时出错。非常感谢@Tzach Zohar!这个问题已经完全解决了!很高兴知道,请接受+投票的答案,以便未来的读者会很容易地找到它!这个问题已经完全解决了!很高兴知道,请接受+投票的答案,以便未来的读者会很容易找到它
trait Extractor[T <: Product] {
def parse(sc: SparkContext, path: String): RDD[T]
def extract(sc: SparkContext, path: String, output: String)(implicit evidence: TypeTag[T]): Unit = { /* unchanged */ }
}