Scala'da türü dinamik olarak belirtmenin herhangi bir yolu var mı

0

Soru

Spark'ta yeniyim Scala, aptalca soru için özür dilerim. Bu yüzden bir dizi masam var:

tablo_a, tablo_b, ...

ve bu tablolar için karşılık gelen tür sayısı

vaka sınıfı classA(...), vaka sınıfı classB(...), ...

Sonra bu tablolardan veri okuyan ve veri kümesi oluşturan bir yöntem yazmam gerekiyor:

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

Diğer tablolar ve türleri aynı. Rutin koddan kaçınmanın bir yolu var mı-her tablo için ayrı ayrı fucntion demek ve bir tane almak mı? Örneğin:

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

Ardından çiftlerin listesini oluşturun (tablo_adı, tür_adı):

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

Sonra foreach kullanarak çağırmak için:

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

Şimdiden teşekkürler!

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

En iyi cevabı

2

Böyle bir şey işe yaramalı

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

Bunun, biraz kod kokusu olan bir değeri atma durumu olduğunu unutmayın. Dan beri Encoder değişmez mi, tableTypePairs böyle bir işe yaramayacak ve böyle bir şey de olmayacak

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

Bir seçenek geçmektir Class yönteme, bu şekilde genel tür T çıkarılacak:

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

Ama o zaman bu listeyi nasıl kullanabileceğinden emin değilim. Dataset olmadan .asInstanceOf.

2021-11-23 22:02:48

Diğer dillerde

Bu sayfa diğer dillerde

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