如何让hadoop getmerge仅合并部分part文件而非目录下全部文件
针对hadoop -getmerge指定部分part文件合并的可行方案
原生hadoop fs -getmerge命令本身不支持筛选目标目录下的部分文件执行合并,默认会合并指定目录下的所有内容,可通过以下两种成熟方案实现需求:
方案1:临时目录中转后合并
不需要修改原目录内容,适合临时合并场景:
- 第一步:在HDFS创建临时存储目录
hadoop fs -mkdir /tmp/custom_merge_temp - 第二步:将需要合并的指定part文件拷贝到临时目录,示例为合并part-00000、part-00002、part-00005三个文件:
hadoop fs -cp /source/target_dir/part-00000 /source/target_dir/part-00002 /source/target_dir/part-00005 /tmp/custom_merge_temp/ - 第三步:对临时目录执行getmerge操作,输出到本地指定文件:
hadoop fs -getmerge /tmp/custom_merge_temp ./local_merged_file.txt - 第四步:操作完成后删除临时目录释放HDFS空间:
hadoop fs -rm -r /tmp/custom_merge_temp
方案2:直接通过cat命令本地合并
不需要占用HDFS临时存储空间,执行效率更高:
直接将需要合并的文件路径按顺序拼接在hadoop fs -cat命令后,输出重定向到本地文件即可,示例:
hadoop fs -cat /source/target_dir/part-00000 /source/target_dir/part-00002 /source/target_dir/part-00005 > ./local_merged_file.txt
如果需要匹配符合规则的批量文件,可以使用通配符筛选,比如只合并编号0到9的part文件:
hadoop fs -cat /source/target_dir/part-0000[0-9] > ./local_merged_file.txt
注意:两种方案都可以通过调整文件的排列顺序,控制最终合并后内容的先后顺序,和
getmerge默认按字典序合并的逻辑一致。
内容的提问来源于stack exchange,提问作者Yang Xu
相关产品推荐
相关产品推荐

