有一个CSV文件的数据湖全天更新。我正在尝试使用Trigger.Once
功能outlined in this blog post创建Spark结构化流工作,以定期将已写入CSV数据湖的新数据写入Parquet数据湖。
这就是我所拥有的:
val df = spark
.readStream
.schema(s)
.csv("s3a://csv-data-lake-files")
以下命令将所有数据写入Parquet湖,但在写完所有数据后没有停止(我必须手动取消作业)。
processedDf
.writeStream
.trigger(Trigger.Once)
.format("parquet")
.option("checkpointLocation", "s3-path-to-checkpoint")
.start("s3-path-to-parquet-lake")
以下工作也有效,但在所有数据写完后都没有停止(我不得不手动取消工作):
val query = processedDf
.writeStream
.trigger(Trigger.Once)
.format("parquet")
.option("checkpointLocation", "s3-path-to-checkpoint")
.start("s3-path-to-parquet-lake")
query.awaitTermination()
以下命令在写入任何数据之前停止了查询。
val query = processedDf
.writeStream
.trigger(Trigger.Once)
.format("parquet")
.option("checkpointLocation", "s3-path-to-checkpoint")
.start("s3-path-to-parquet-lake")
query.stop()
如何配置writeStream
查询以等待所有增量数据写入Parquet文件然后停止?
答案 0 :(得分:1)
结构化流式传输的主要目的是连续处理数据,而无需在新数据到达时启动/停止流。请阅读this了解详情。
从Spark 2.0.0 StreamingQuery
开始,方法processAllAvailable
等待处理所有源数据并将其提交到接收器。请注意,scala docs states to use this method for testing purpose only。
因此,代码应如下所示(如果您仍然需要):
query.processAllAvailable
query.stop
答案 1 :(得分:1)
我得到了结构化流+触发器。一旦在Parquet数据湖上正常工作。
我认为它不适用于CSV数据湖,因为CSV数据湖在嵌套目录中有大量小文件。 Spark不喜欢使用小型CSV文件(我认为需要将它们全部打开以读取标题),并且真的讨厌何时需要遍历S3目录。
因此,我认为Spark结构化流+触发器。代码很好-他们只需要使CSV阅读器技术更好即可。