如何通过HDFS命令行批量解压目录文件并单独移动到目标文件夹
问题原因
你原命令中hdfs dfs -cat会将源目录下所有文件的内容拼接为单个标准流,管道传给hadoop fs -put -时,程序会将整段标准流写入为单个无分隔的文件,因此最终只会得到合并后的结果,不符合单个解压存储的需求。
单行实现方案
直接使用Shell循环配合HDFS原生命令即可实现,无需引入其他编程语言:
for f in `hdfs dfs -ls /user/[somedir1]/* | grep -v '^Found' | grep -v '^d' | awk '{print $NF}'`; do fn=$(basename $f); hdfs dfs -cat $f | hdfs dfs -put - /user/[somedir2]/uncompressed/$fn; done
注:HDFS的
cat指令自带对gzip、bzip2、snappy等Hadoop原生支持压缩格式的自动解压能力,无需额外加装解压工具。
可选调整项
- 如果你需要去掉压缩文件后缀,比如源文件为
xxx.gz,解压后存为xxx,可以将fn=$(basename $f)修改为fn=$(basename $f .gz),后缀名匹配你实际使用的压缩格式即可。 - 若源目录下还嵌套有子目录,可以将
hdfs dfs -ls替换为hdfs dfs -ls -R递归遍历所有层级的文件。
内容的提问来源于stack exchange,提问作者user2552108
相关产品推荐
相关产品推荐

