如何在Spark结构化流中使用foreach方法将数据插入HIVE

时间:2019-01-26 14:13:46

标签: apache-spark spark-structured-streaming

我尝试使用foreach方法将数据插入到HIVE表中。

我使用spark 2.3.0。

这是我的代码

   df_drop_window.writeStream
     .foreach(new ForeachWriter[Row]() {
       override def open(partitionId: Long, epochId: Long): Boolean = true
       override def process(value: Row): Unit = {
         println(s">> Processing ${value}")
         // how to onvert the value as dataframe ?
       }
       override def close(errorOrNull: Throwable): Unit = {
       }
     }).outputMode("update").start()

正如您在上面看到的,我想将“值”转换为数据框,然后将数据插入到HIVE表中,就像插入表名(从数据框中选择*)一样。有人可以帮忙吗?是火花串流的新手法

我只能看到以下可用选项。有人可以说我如何将value:Row转换为data enter image description here frame?

我尝试了以下操作,但出现错误(org.apache.spark.SparkException:任务无法序列化)

            df.writeStream
       .foreach(new ForeachWriter[Row]() {
       override def open(partitionId: Long, epochId: Long): Boolean = true
       override def process(value: Row): Unit = {
       val rowsRdd = sc.parallelize(Seq(value))
       val df2 = spark.createDataFrame(rowsRdd, schema)
       df2.createOrReplaceTempView("testing2")
       spark.sql("insert into table are.table_name1 Partition(date) select * from testing2")
       }
       override def close(errorOrNull: Throwable): Unit = {
       }
       }).outputMode("append").start()

1 个答案:

答案 0 :(得分:0)

Spark会话无法在执行者端序列化,您需要广播Spark会话