Apache spark 如何从流式查询写入拼花文件?

Apache spark 如何从流式查询写入拼花文件?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我正在使用Spark 2.2结构化流媒体读取CSV文件。 我对将结果写入控制台的查询如下: val consoleQuery=异常 .withWatermark(“时间”,“5年”) .groupBy(窗口($“时间”,“1小时”),$“id”) .count() .writeStream .格式(“控制台”) .选项(“截断”,值=false) .trigger(触发器处理时间(10秒)) .outputMode(outputMode.Complete()) 结果看起来不错: +------

我正在使用Spark 2.2结构化流媒体读取CSV文件。 我对将结果写入控制台的查询如下:

val consoleQuery=异常
.withWatermark(“时间”,“5年”)
.groupBy(窗口($“时间”,“1小时”),$“id”)
.count()
.writeStream
.格式(“控制台”)
.选项(“截断”,值=false)
.trigger(触发器处理时间(10秒))
.outputMode(outputMode.Complete())
结果看起来不错:

+---------------------------------------------+-------------+-----+
|window                                       |id           |count|
+---------------------------------------------+-------------+-----+
|[2017-02-17 09:00:00.0,2017-02-17 10:00:00.0]|EXC0000000001|1    |
|[2017-02-17 09:00:00.0,2017-02-17 10:00:00.0]|EXC0000000002|8    |
|[2017-02-17 08:00:00.0,2017-02-17 09:00:00.0]|EXC2200002   |1    |
+---------------------------------------------+-------------+-----+
但在将其写入拼花文件时

val parquetQuery=例外
.withWatermark(“时间”,“5年”)
.groupBy(窗口($“时间”,“1小时”),$“id”)
.count()
.合并(1)
.writeStream
.格式(“拼花地板”)
.选项(“路径”、“src/main/resources/parquet”)
.trigger(触发器处理时间(10秒))
.选项(“检查点位置”、“src/main/resources/checkpoint”)
.outputMode(outputMode.Append())
和另一份工作一起阅读

val data = spark.read.parquet("src/main/resources/parquet/")
结果是:

+------+---+-----+
|window|id |count|
+------+---+-----+
+------+---+-----+

TL;DR
parquetQuery
尚未启动,因此流式查询没有输出

查看
parquetQuery
的类型,它只是对某个点应该启动的查询的描述。因为它不是,所以查询永远无法执行任何将写入流的操作

parquetQuery
声明的末尾添加
start
(在调用链之后或作为调用链的一部分)

val parquetQuery=例外
.withWatermark(“时间”,“5年”)
.groupBy(窗口($“时间”,“1小时”),$“id”)
.count()
.合并(1)
.writeStream
.格式(“拼花地板”)
.选项(“路径”、“src/main/resources/parquet”)
.trigger(触发器处理时间(10秒))
.选项(“检查点位置”、“src/main/resources/checkpoint”)
.outputMode(outputMode.Append())

.start//no,我只是在我的问题帖子中遗漏了启动查询和等待的代码。开始和等待对于Being posted来说太明显了:-)显示启动流式查询的整个代码(所以我不是指你自己已经弄明白的事情)。谢谢运行查询时缺少的代码:
val runningQuery=parquetQuery.start runningQuery.explain runningQuery.waitingtermination
我认为
.withWatermark(“time”,“5年”)
.outputMode(outputMode.Append())
可能是没有可用输出的根本原因。你能用水印(“时间”,“1秒”)
代替并重新开始吗?我改为1秒,但仍然得到相同的结果。我做了以下额外观察:当更改为1秒并在给定位置丢弃另一个csv文件时,该文件包含给定时间窗口中的数据(但带有另一个时间戳)我在拼花地板文件中得到的数据如下:
+----------------------------------------------------------------------------------------------------+-------------------------+--------------window | id | count |+-----------------------------------------------------------------------------------------------+-----------++----------[2017-02-17 08:00:00.02017-02-17 09:00:00.0]|EXC28002 | 1 |+----------------------------------------------------------------------------------------------------------------------------------+
但不来自其他时间窗口。看起来Append只会更新或“关闭”接收时间戳比上一个最大值更新的数据的时间窗口。除了Append,我还能使用什么?使用Complete或Update I get
数据源parquet不支持更新输出模式。您是否解决了此问题?
val parquetQuery = exceptions
  .withWatermark("time", "5 years")
  .groupBy(window($"time", "1 hour"), $"id")
  .count()
  .coalesce(1)
  .writeStream
  .format("parquet")
  .option("path", "src/main/resources/parquet")
  .trigger(Trigger.ProcessingTime(10.seconds))
  .option("checkpointLocation", "src/main/resources/checkpoint")
  .outputMode(OutputMode.Append())
  .start // <-- that's what you miss