我有一個使用以下模式的 Dataset[Year]:
case class Year(
day: Int,
month: Int,
Year: Int
)
有什么方法可以讓集合維護模式?
我嘗試過這個:
println("Print -> " ds.collect().toList)
但結果是:
Print -> List([01,01,2022], [31,01,2022])
我期待的是:
Print -> List(Year(01,01,2022), Year(31,01,2022)
我知道使用地圖我可以對其進行調整,但我正在嘗試創建一個接受任何模式的通用方法,為此我無法添加進行轉換的地圖。
那是我的方法:
class SchemeList[A]{
def set[A](ds: Dataset[A]): List[A] = {
ds.collect().toList
}
}
顯然方法回傳得到了正確的簽名,但是在運行引擎時,它得到一個錯誤:
val setYears = new SchemeList[Year]
val YearList: List[Year] = setYears.set(df)
Exception in thread "main" java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to schemas.Schemas$Year
uj5u.com熱心網友回復:
根據您評論中的其他資訊:
通過 jdbc 創建另一個資料框時,我需要將此串列用作變數(我需要在 postgresql 中進行特定選擇)。是否有更高效的方式將資料幀中的值作為選擇中的引數傳遞?
給定您的初始資料集:
val yearsDS: Dataset[Year] = ???
并且您想要執行以下操作:
val desiredColumns: Array[String] = ???
spark.read.jdbc(..).select(desiredColumns.head, desiredColumns.tail: _*)
您可以通過執行以下操作找到列名yearsDS:
val desiredColumns: Array[String] = yearsDS.columns
Spark 通過使用 來實作這一點def schema,它在Dataset. 您可以在此處查看 def 列的定義。
uj5u.com熱心網友回復:
可能是你有一個 DataFrame,而不是一個 DataSet。嘗試使用“as”將資料框轉換為資料集。像這樣
val year = Year(1,1,1)
val years = Array(year,year).toList
import spark.implicits._
val df = spark.
sparkContext
.parallelize(years)
.toDF("day","month","Year")
.as[Year]
println(df.collect().toList)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448525.html
上一篇:我如何將行與組配對?
