#scala #apache-spark #traits #implicit #scala-reflect
#scala #apache-spark #Трейты #неявный #scala-отразить
Вопрос:
У меня много таблиц 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 недоступен тег типа .this.DT ……
Ошибка:(11, 73) недостаточно аргументов для метода schemaFor: (неявное доказательство $ 5: org.apache.spark.sql.catalyst.ScalaReflection.universe.TypeTag[Trait1.this.DT])org.apache.spark.sql.catalyst.ScalaReflection.Схема. Неопределенное значение параметра свидетельствует о 5 долларах США.
Вы можете мне помочь? Спасибо
Ответ №1:
Попробуйте ввести абстрактный член для TypeTag
, разрешите его как неявный параметр при schemaFor
вызове вручную и сделайте SCHEMA
lazy val .
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))
Комментарии:
1. Ну, спасибо! 🙂