มันมีทางที่จะระบุชนิดใน language dynamically

0

คำถาม

ฉันยังใหม่อยู่ในออลสปาร์ค,Language ดังนั้นขอโทษสำหรับคำถามที่โง่มาก ดังนั้นฉันต้องเป็นจำนวนของตารางข้อมูลเรียบร้อยแล้ว:

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 คือ invariant, tableTypePairs มันไม่มีประโยชน์ของประเภทและฉันก็จะเหมือนบางอย่าง

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

หนึ่งตัวเลือกนี้หากต้องส่งต่อ Class ไปที่วิธีการทางนี้ทางนี้คนประเภททั่วไป T จะ inferred:

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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่