Spark结构化流水印错误

时间:2018-11-02 09:59:45

标签: apache-spark apache-spark-sql spark-streaming

关注this question

我有与以下格式相同的json流数据

ALTER TABLE t1 ENGINE = InnoDB;

我需要将其转换为以下格式

|  A    | B                                        |
|-------|------------------------------------------|
|  ABC  |  [{C:1, D:1}, {C:2, D:4}]                | 
|  XYZ  |  [{C:3, D :6}, {C:9, D:11}, {C:5, D:12}] |

要实现这一点,请按照上一个问题的建议进行转换。

|   A   |  C  |  D   |
|-------|-----|------|
|  ABC  |  1  |  1   |
|  ABC  |  2  |  4   |
|  XYZ  |  3  |  6   |
|  XYZ  |  9  |  11  |
|  XYZ  |  5  |  12  | 

现在我试图将结果保存到HDFS中的csv文件中

val df1 = df0.select($"A", explode($"B")).toDF("A", "Bn")

val df2 = df1.withColumn("SeqNum", monotonically_increasing_id()).toDF("A", "Bn", "SeqNum") 

val df3 = df2.select($"A", explode($"Bn"), $"SeqNum").toDF("A", "B", "C", "SeqNum")

val df4 = df3.withColumn("dummy", concat( $"SeqNum", lit("||"), $"A"))

val df5 = df4.select($"dummy", $"B", $"C").groupBy("dummy").pivot("B").agg(first($"C")) 

val df6 = df5.withColumn("A", substring_index(col("dummy"), "||", -1)).drop("dummy")

现在我得到以下错误。

  

线程“主”中的异常org.apache.spark.sql.AnalysisException:当流数据帧/数据集上的流聚合没有水印时,不支持追加输出模式;   EventTimeWatermark event_time#223:时间戳,时间间隔

我的疑问是,我不会执行任何聚合,这将要求它存储超出该行处理时间的聚合值。为什么会出现此错误?我可以保持加水印为0秒吗?

任何对此的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

据我了解,仅当您在事件时间执行窗口操作时才需要加水印。 Spark使用水印处理后期数据,并且出于相同的目的,Spark需要保存较早的聚合。

以下链接通过示例很好地说明了这一点: https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#handling-late-data-and-watermarking

我在转换中没有看到任何窗口操作,如果是这种情况,那么我认为您可以尝试在不添加水印的情况下运行流查询。