目前我们在生产中运行Spark流。我正在将代码转换为使用结构化流式传输。 我能够成功地从Kinesis读取数据并在S3中写入(接收)Parquet文件。
我们的业务逻辑要求,我们在每小时文件夹中编写流数据。来自kinesis的传入数据没有任何日期时间字段。所以不能分区日期时间。
我们定义了一个函数[getSubfolderNameFromDate()]
,它可以获取当前小时+日期(1822062017 - 当天的第18小时,2017年6月22日),因此我们可以在每小时文件夹中写入数据。
使用Spark流,Context会重新初始化并自动在下一小时文件夹中写入数据,但我无法通过结构化流式传输实现相同的功能。
例如,在一天的第4小时流式播放了200万条记录,应该写入"S3_location/0422062017.parquet/"
,在接下来的一小时内流式传输的数据应该在"S3_location/0522062017.parquet/"
等等。<等等。 / p>
使用结构化流媒体,它会在一天内连续写入同一文件夹,我理解这是因为它只评估文件夹名称一次并连续将数据附加到它。 但我想将新数据附加到每小时文件夹,有没有办法实现这个目标?
我目前正在使用以下查询:
val query = streamedDataDF
.writeStream
.format("parquet")
.option("checkpointLocation", checkpointDir)
.option("path", fileLocation + FileDirectory.getSubfolderNameFromDate() + ".parquet/")
.outputMode("append")
.start()