如何定义Spark结构化的流式文件接收器文件路径或文件名?

时间:2018-06-27 07:20:20

标签: apache-spark hdfs spark-structured-streaming

我正在使用Spark结构化流处理来自流数据源的数据,并且正在使用文件接收器。数据将在处理后放入hdfs。

我遇到一个问题,就是输出文件类似于part-00012-8d701427-8289-41d7-9b4d-04c5d882664d-c000.txt。这使我无法在上一个小时输出文件。

是否可以将输出文件自定义为timestamp_xxx或类似的内容?或者,我可以按批次输出到不同的路径吗?

2 个答案:

答案 0 :(得分:6)

您无法更改已保存文件的名称。但是,您可以更改其保存位置的文件夹结构。使用partitionBy()在数据集中指定的列之后对数据进行分区,在这种情况下,可能需要关注年,月,日和小时:

df.writeStream 
  .format("parquet") // can be "orc", "json", "csv", etc.
  .option("path", "/path/to/save/") 
  .partitionBy("year", "month", "day", "hour") 
  .start() 

这将从path开始创建一个文件夹结构,如下所示:

year=2018
|
|--> month=06
|    |
|    |--> day=26
|    |    |
|    |    |--> hour=10
|    |    |--> hour=11
|    |    |--> ...
|    |
|    |--> day=27
|    |    |
|    |    |--> ...

当然,根据可用的内容,其他列也可以用于对文件进行分区。

答案 1 :(得分:-1)

我相信这种文件格式是Spark用来存储每个分区的值的一种内部方式。如果您正在使用某种形式的Blob存储(对不起,我是Windows用户),您仍然应该能够从输出位置加载回文件,然后使用DataFrame重新对其进行处理。

我想说的是,尽管您在文件名中没有太多发言权,因为这是Spark本身所做的事情,它不应阻止您创建自己的工作流,该工作流中您将在批处理中查找内容文件具有一定的时间戳(我假设out文件的内容包含某种DataTime列,如果不是,最好添加一个)

这就是我要进行的工作,将时间戳记作为文件内容的一部分,然后您可以使用实际的文件内容(正如我所说的读入DataFrame所说的那样),然后仅对文件使用常规的DataFrame / Map操作加载的输出数据

我有点粗谈这个here