Spark Structured Streaming - 每小时writeStream分割数据

时间:2017-06-22 23:24:32

标签: scala apache-spark amazon-kinesis spark-structured-streaming

目前我们在生产中运行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()  

0 个答案:

没有答案