我正在使用Spark结构化流处理来自流数据源的数据,并且正在使用文件接收器。数据将在处理后放入hdfs。
我遇到一个问题,就是输出文件类似于part-00012-8d701427-8289-41d7-9b4d-04c5d882664d-c000.txt
。这使我无法在上一个小时输出文件。
是否可以将输出文件自定义为timestamp_xxx或类似的内容?或者,我可以按批次输出到不同的路径吗?
答案 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。