【问题标题】: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))