Există vreo modalitate de a specifica tipul în scala dinamic

0

Problema

Sunt nou in Scânteie, Scala, deci scuze pentru întrebare stupidă. Deci, am o serie de tabele:

table_a, table_b, ...

și numărul de tipurile corespunzătoare pentru aceste tabele

caz clasa classA(...), caz clasa classB(...), ...

Apoi am nevoie pentru a scrie o metode care citește datele din aceste tabele și de a crea setul de date:

def getDataFromSource: Dataset[classA] = {
       val df: DataFrame = spark.sql("SELECT * FROM table_a")
       df.as[classA]
}

La fel și pentru celelalte mese și tipuri. Există vreo modalitate de a evita rutina codul - adică individuale fucntion pentru fiecare tabel și cu unu? De exemplu:

def getDataFromSource[T: Encoder](table_name: String): Dataset[T] = {
       val df: DataFrame = spark.sql(s"SELECT * FROM $table_name")
       df.as[T]
}

Apoi, creați o listă de perechi (table_name, type_name):

val tableTypePairs = List(("table_a", classA), ("table_b", classB), ...)

Apoi pentru a apela folosind foreach:

tableTypePairs.foreach(tupl => getDataFromSource[what should I put here?](tupl._1))

Multumesc anticipat!

apache-spark scala
2021-11-23 21:17:33
2

Cel mai bun răspuns

2

Ceva de genul asta ar trebui sa mearga

def getDataFromSource[T](table_name: String, encoder: Encoder[T]): Dataset[T] =
  spark.sql(s"SELECT * FROM $table_name").as(encoder)

val tableTypePairs = List(
  "table_a" -> implicitly[Encoder[classA]],
  "table_b" -> implicitly[Encoder[classB]]
)

tableTypePairs.foreach {
  case (table, enc) =>
    getDataFromSource(table, enc)
}

Rețineți că acesta este un caz de a renunța la o valoare, care este un pic de un cod de miros. Deoarece Encoder este invariantă, tableTypePairs nu-i va fi util de un tip, și nici ceva de genul

tableTypePairs.map {
  case (table, enc) =>
    getDataFromSource(table, enc)
}
2021-11-23 22:09:20
0

O opțiune este de a trece Class metoda, acest fel de tip generic T va fi dedus:

def getDataFromSource[T: Encoder](table_name: String, clazz: Class[T]): Dataset[T] = {
       val df: DataFrame = spark.sql(s"SELECT * FROM $table_name")
       df.as[T]
}

tableTypePairs.foreach { case (table name, clazz) => getDataFromSource(tableName, clazz) }

Dar eu nu sunt sigur de cum va fi în măsură să exploateze această listă de Dataset fără .asInstanceOf.

2021-11-23 22:02:48

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................