Возможно ли получить схему из поля типа в чертеже?

#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. Ну, спасибо! 🙂