【问题标题】:Is it possible to get schema from a type field in trait?是否可以从 trait 中的类型字段获取模式?
【发布时间】:2020-12-13 03:01:55
【问题描述】:

我有很多 HIVE 表,我想按特征包装查询。

trait Trait1 {
  type DT <: Product
  val SCHEMA = org.apache.spark.sql.catalyst.ScalaReflection.schemaFor[DT].dataType.asInstanceOf[org.apache.spark.sql.types.StructType]
}
object O1 extends Trait1 {
  case class o1_info(gameId:Int, logdate:String)
  override type DT = o1_info
}

// TETS: println(O1.SCHEMA)

出现编译错误:

错误:(11, 73) 没有可用于 Trait1.this.DT 的 TypeTag ......

错误:(11, 73) 方法 schemaFor 的参数不足: (隐式证据$5: org.apache.spark.sql.catalyst.ScalaReflection.universe.TypeTag[Trait1.this.DT])org.apache.spark .sql.catalyst.ScalaReflection.Schema。 未指定值参数evidence$5。

你能帮帮我吗?谢谢

【问题讨论】:

    标签: scala apache-spark traits implicit scala-reflect


    【解决方案1】:

    尝试为TypeTag引入一个抽象成员,将其解析为schemaFor手动调用中的隐式参数,并使SCHEMA惰性验证。

    import org.apache.spark.sql.catalyst.ScalaReflection
    import org.apache.spark.sql.catalyst.ScalaReflection.universe.{TypeTag, typeTag}
    import org.apache.spark.sql.types.StructType
    
    trait Trait1{
      type DT <: Product
      def ttag: TypeTag[DT]
      lazy val SCHEMA = ScalaReflection.schemaFor[DT](ttag).dataType.asInstanceOf[StructType]
    }
    object O1 extends Trait1 {
      case class o1_info(gameId:Int, logdate:String)
      override type DT = o1_info
      override val ttag: TypeTag[o1_info] = typeTag[o1_info]
    }
    
    println(O1.SCHEMA)
    //StructType(StructField(gameId,IntegerType,false), StructField(logdate,StringType,true))
    

    【讨论】:

    • 嗯,谢谢! :-)
    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 2016-04-21
    • 1970-01-01
    • 2011-04-11
    • 2010-10-10
    • 2017-11-02
    • 2022-06-14
    • 2014-10-24
    相关资源
    最近更新 更多