我是 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]
}
然后創建對串列 (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))
提前致謝!
uj5u.com熱心網友回復:
這樣的事情應該作業
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)
}
uj5u.com熱心網友回復:
一種選擇是將 傳遞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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365212.html
