我有许多从Kafka流生成的小文件,所以我喜欢将小文件合并为一个文件,但是这种合并是基于日期的,即原始文件夹可能有多个先前的文件,但是我只喜欢在给定的日期进行合并文件到一个文件。
有什么建议吗?
答案 0 :(得分:2)
使用类似下面的代码的方式迭代较小的文件,并将它们聚合为一个大文件(假设source
包含指向较小文件的HDFS路径,而target
是您在其中的路径想要您的大结果文件):
val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)
fs.listStatus(new Path(source)).map(_.getPath.toUri.getPath).
foreach(name => spark.read.text(name).coalesce(1).write.mode(Append).text(target))
此示例假定文本文件格式,但是您也可以读取任何Spark支持的格式,并且也可以将不同的格式用于源和目标
答案 1 :(得分:1)
您应该可以使用.repartition(1)
将所有结果写入1个文件。如果您需要按日期划分,请考虑partitionBy("your_date_value")
。
如果您使用的是HDFS和S3,这可能也会有所帮助。您甚至可能甚至使用s3-dist-cp
并停留在HDFS中。
有一个特定的选项可以使用基于正则表达式模式的--groupBy选项在HDFS中聚合多个文件。因此,如果日期在文件名中,则可以根据该模式进行分组。
答案 2 :(得分:-1)
您可以开发一个Spark应用程序。使用此应用程序可以从小文件中读取数据,并创建dataframe
并将dataframe
以追加模式写入大文件中。