是否有任何方式指定型类动态

0

的问题

我在新的火花,斯卡拉,抱歉,愚蠢的问题。 所以我有许多的表:

table_a,table_b,...

和数量对应的类型对这些表

情况类下面(...),情况类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)
}

注意,这种情况下的废弃有价值,这是一个有点代码的气味。 由于 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ý
..................................................................................................................