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

How to define a spark structured streaming file sink file path or file name?

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

我遇到了输出文件类似于 part-00012-8d701427-8289-41d7-9b4d-04c5d882664d-c000.txt 的问题。这让我无法在最后一小时内获得文件输出。

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

我相信这种文件格式是 Spark 用于存储每个分区的值的内部格式。如果您正在使用某种 blob 存储(对不起,我是 windows 用户),您仍然应该能够从输出位置加载文件,然后使用 DataFrame 再次处理它们。

我想说的是,尽管您在文件名中没有太多发言权,因为这是 Spark 自己做的事情,它不应该阻止您创建自己的工作流,在您希望看到的地方批处理东西在文件中放置一些时间戳(我假设输出文件内容有某种 DataTime 列,如果没有,添加一个可能是个好主意)

这就是我处理事情的方式,将时间戳作为文件内容的一部分,然后您可以使用实际文件内容(正如我所说的读入 DataFrame 所说),然后只需使用正常的 DataFrame / Map 操作在加载的输出数据上

我大概说一下这个here

您不能更改已保存文件的名称。但是,您可以更改保存位置的文件夹结构。使用 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
|    |    |
|    |    |--> ...

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