如何将HDFS小文件合并为一个大文件?

时间:2018-07-25 18:36:59

标签: bash scala apache-spark hdfs

我有许多从Kafka流生成的小文件,所以我喜欢将小文件合并为一个文件,但是这种合并是基于日期的,即原始文件夹可能有多个先前的文件,但是我只喜欢在给定的日期进行合并文件到一个文件。

有什么建议吗?

3 个答案:

答案 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中。

https://aws.amazon.com/blogs/big-data/seven-tips-for-using-s3distcp-on-amazon-emr-to-move-data-efficiently-between-hdfs-and-amazon-s3/#5

有一个特定的选项可以使用基于正则表达式模式的--groupBy选项在HDFS中聚合多个文件。因此,如果日期在文件名中,则可以根据该模式进行分组。

答案 2 :(得分:-1)

您可以开发一个Spark应用程序。使用此应用程序可以从小文件中读取数据,并创建dataframe并将dataframe以追加模式写入大文件中。

相关问题