首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala中,如何指定泛型来扩展case类?

问在scala中,如何指定泛型来扩展case类?
EN

Stack Overflow用户
提问于 2016-04-09 03:12:47
回答 2查看 932关注 0票数 0

当我写这样的特质时:

代码语言:javascript
复制
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:

代码语言:javascript
复制
case class X(uid: String, app: String, tag: String)

case class Y(uid: String, dvc: String, tag: String)

我是斯卡拉的新手。隐式转换和协变量似乎不起作用。多么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-09 19:08:17

RDD.toDF()的存在得益于将其隐式转换为DataFrameHolder。此转换由具有以下签名的方法完成:

代码语言:javascript
复制
 implicit def rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A]): DataFrameHolder

因此-转换为工作:

  • T必须是Product的子类,它是所有案例类(以及元组等)的超类。
  • 调用方必须对类型TypeTag具有隐式T (以克服类型擦除)

所以-你基本上想要改变你的特征声明如下:

代码语言:javascript
复制
// won't work...
trait Extractor[T <: Product : TypeTag] { /* unchanged */ }

但是,这些特性不能有具有上下文/视图边界的类型,因此这个声明将无法工作。在这里你有两个选择:

  1. 将您的特性更改为一个类(可以是抽象的)并添加一个TypeTag: 抽象类ExtractorT <:积: TypeTag { /*不变*/ }
  2. 向extract方法添加一个隐式参数: 特质ExtractorT <:产品{ def解析(sc: SparkContext,path: String):RDDT def提取(sc: SparkContext,path: String,output: String)(隐式证据: TypeTagT):TypeTagT={ /*未更改*}
票数 2
EN

Stack Overflow用户

发布于 2016-04-09 03:47:26

代码语言:javascript
复制
object ExtractorX extends Extractor[X] {
    override parse(sc: SparkContext, path: String): RDD[X] = ...
}

或

代码语言:javascript
复制
val extractorX = new Extractor[X] {
    override parse(sc: SparkContext, path: String): RDD[X] = ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36512308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档