簡體   English   中英

無法使用 spark 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM