Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中,如何指定泛型来扩展case类?_Scala_Apache Spark - Fatal编程技术网

在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不能具有具有上下文/视图边界的类型,因此此声明不起作用。这里有两个选项:

  • 将您的trait更改为一个类(可以是抽象的),并添加一个
    TypeTag

    abstract class Extractor[T <: Product : TypeTag] { /* unchanged */ }
    
  • RDD.toDF()
    的存在得益于隐式转换为
    DataFrameHolder
    。此转换由具有以下签名的进行:

     implicit def rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A]): DataFrameHolder
    
    但是,traits不能具有具有上下文/视图边界的类型,因此此声明不起作用。这里有两个选项:

  • 将您的trait更改为一个类(可以是抽象的),并添加一个
    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 */ }
    }