Existuje nejaký spôsob, ako určiť typ v scala dynamicky

0

Otázka

Som nová v Iskra, Scala, takže ospravedlňujem sa za hlúpu otázku. Tak som si niekoľko tabuliek:

table_a, table_b, ...

a počet zodpovedajúcich typov týchto tabuliek

prípade triedy classA(...), prípad triedy classB(...), ...

Potom som potrebu napísať metódy, ktoré čítať údaje z týchto tabuliek a vytvoriť dataset:

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

Rovnaké pre iné tabuľky a typov. Existuje nejaký spôsob, ako sa vyhnúť rutinné kód - mám na mysli jednotlivé fucntion pre každú tabuľku, a získať tým, že s jedným? Napríklad:

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

Potom vytvorte zoznam párov (table_name, type_name):

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

Potom hovor pomocou foreach:

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

Vďaka vopred!

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

Najlepšiu odpoveď

2

Niečo podobné by to malo fungovať

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)
}

Upozorňujeme, že toto je prípad odovzdania hodnotu, ktorá je trochu kód vôňu. Od Encoder je nemenné, tableTypePairs nebude mať užitočné typu, a ani by sa niečo podobné

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

Jedna možnosť je prejsť Class metódy, tak všeobecný typ T bude spočívať:

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) }

Ale potom som si nie ste istí, ako budete môcť využiť tento zoznam Dataset bez .asInstanceOf.

2021-11-23 22:02:48

V iných jazykoch

Táto stránka je v iných jazykoch

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