![](/img/trans.png)
[英]Get the row corresponding to the latest timestamp in a Spark Dataset using Scala
[英]Unable to get the value of first column from a row in dataset using spark scala
我正在嘗試使用 foreachpartition 迭代 dataframe 以將值插入數據庫。 我使用了 foreachpartition 並對行進行分組,並使用 foreach 迭代每一行。 請在下面找到我的代碼,
val endDF=spark.read.parquet(path).select("pc").filter(col("pc").isNotNull);
endDF.foreachpartition((partition: Iterator[Row]) =>
class.forname(driver)
val con=DriverManager.connection(jdbcurl,user,pwd)
partition.grouped(100).foreach(batch => {
val st=con.createStatement()
batch.foreach(row => {
val pc=row.get(0).toString()
val in=s"""insert tshdim (pc) values(${pc})""".stripMargin
st.addBatch(in)
})
st.executeLargeBatch
})
con.close()
})
當我嘗試從 row(val pc=row.get(0).toString()) 獲取 pc 值時,它會引發以下異常。 我在 spark-shell 中這樣做
org.apache.spark.SparkException:任務不可序列化。 .
造成的:
Java.io.NotSerializable exception: org.apache.spark.sql.DataSet$RDDQueryExecution$ Serialization stack: Object not serializable (class:org.apache.spark.sql.DataSet$RDDQueryExecution$, value: org.apache.spark.sql .DataSet$RDDQueryExecution$@jfaf ) -field(class:org.apache.spark.sql.DataSet, name:RDDQueryExecutionModule, type: org.apache.spark.sql.DataSet$RDDQueryExecution$) -object(class:org.apache .spark.sql.DataSet,[pc:String])
foreachpartition 中的foreachpartition
需要序列化並傳遞給 executors。 因此,在您的情況下,spark 正在嘗試序列化 DriverManager class 以及您的 jdbc 連接的所有內容,其中一些不可序列化。 foreachPartition 在沒有 DriverManager 的情況下工作 -
endDF.foreachPartition((partition: Iterator[Row]) => {
partition.grouped(100).foreach(batch => {
batch.foreach(row => {
val pc=row.get(0)
println(pc)
})
})
})
要將其保存在您的數據庫中,請先執行.collect
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.