वहाँ किसी भी तरह से निर्दिष्ट करने के लिए प्रकार स्काला में गतिशील रूप से

0

सवाल

मैं कर रहा हूँ नई स्पार्क में, स्काला, तो के लिए खेद बेवकूफ सवाल है । तो मैं एक तालिकाओं की संख्या:

table_a, table_b, ...

और की संख्या, इसी प्रकार इन के लिए टेबल

मामला वर्ग classA(...), के मामले में वर्ग classB(...), ...

तो मैं लिखने की जरूरत है एक तरीके में पढ़ा है कि इन तालिकाओं से डेटा और बनाने डेटासेट:

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

एक ही के लिए अन्य तालिकाओं और प्रकार. वहाँ किसी भी तरह से बचने के लिए दिनचर्या कोड - मेरा मतलब है अलग-अलग fucntion प्रत्येक तालिका के लिए और के द्वारा प्राप्त के साथ एक? उदाहरण के लिए:

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

तो बनाने की सूची में जोड़े (table_name, type_name):

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

ध्यान दें कि यह एक मामला है के discarding के एक मूल्य है, जो एक सा है, एक कोड की बू आ रही है । के बाद से 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ý
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में