Есть ли какой-либо способ динамически указать тип в scala

0

Вопрос

Я новичок в Spark, Scala, так что извините за глупый вопрос. Итак, у меня есть несколько таблиц:

table_a, table_b, ...

и количество соответствующих типов для этих таблиц

класс дела ClassA(...), класс дела ClassB(...), ...

Затем мне нужно написать методы, которые считывают данные из этих таблиц и создают набор данных:

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

То же самое относится и к другим таблицам и типам. Есть ли какой - нибудь способ избежать рутинного кода-я имею в виду индивидуальную работу для каждой таблицы и обойтись одним? Например:

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

Затем создайте список пар (имя таблицы, имя типа):

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

Затем вызвать его с помощью foreach:

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

Заранее спасибо!

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

Лучший ответ

2

Что - то вроде этого должно сработать

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

Обратите внимание, что это случай отбрасывания значения, которое немного напоминает запах кода. С Encoder является инвариантным, tableTypePairs не будет такого полезного типа, и также не будет чего-то подобного

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

Один из вариантов-передать Class к методу, таким образом, универсальный тип T будет сделан вывод:

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

Но тогда я не уверен, как вы сможете использовать этот список Dataset без .asInstanceOf.

2021-11-23 22:02:48

На других языках

Эта страница на других языках

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