bee*_*alo 6 bash hadoop file-rename
如何重命名hdfs目录中的所有文件以获得.lzo扩展名?.lzo.index不应重命名文件.
例如,此目录列表:
Run Code Online (Sandbox Code Playgroud)file0.lzo file0.lzo.index file0.lzo_copy_1
可以重命名为:
Run Code Online (Sandbox Code Playgroud)file0.lzo file0.lzo.index file0.lzo_copy_1.lzo
这些文件是lzo压缩的,我需要它们才能让.lzohadoop识别扩展名.
mt_*_*mt_ 13
如果您不想为此编写Java代码 - 我认为使用命令行HDFS API是您最好的选择:
hadoop fs -mv URI [URI …] <dest>
你可以使用一个小的衬里获得路径:
% hadoop fs -ls /user/foo/bar | awk '!/^d/ {print $8}'
/user/foo/bar/blacklist
/user/foo/bar/books-eng
...
Run Code Online (Sandbox Code Playgroud)
该awk会移除output..now你可以把这些文件放到一个变量目录:
% files=$(hadoop fs -ls /user/foo/bar | awk '!/^d/ {print $8}')
Run Code Online (Sandbox Code Playgroud)
并重命名每个文件..
% for f in $files; do hadoop fs -mv $f $f.lzo; done
Run Code Online (Sandbox Code Playgroud)
您还可以使用awk过滤文件以获取其他条件.这应该删除与正则表达式匹配的文件nolzo.然而,这是未经测试的.但是这样你就可以编写灵活的过滤器.
% files=$(hadoop fs -ls /user/foo/bar | awk '!/^d|nolzo/ {print $8}' )
Run Code Online (Sandbox Code Playgroud)
测试它是否适用于替换hadoop命令echo:
$ for f in $files; do echo $f $f.lzo; done
Run Code Online (Sandbox Code Playgroud)
编辑:更新要使用的示例,awk而不是sed更可靠的输出.
"正确"的方法可能是使用HDFS Java API.但是对于大多数作业来说,使用shell可能更快,更灵活.
当我不得不重命名许多文件时,我正在寻找一个有效的解决方案,并且偶然发现了这个问题和thi-duong-nguyen的重写多个文件的说法很慢.我为批量重命名操作实现了一个Java解决方案,我强烈建议,因为它的速度要快几个数量级.其基本思想是使用org.apache.hadoop.fs.FileSystem的rename()方法:
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:8020");
FileSystem dfs = FileSystem.get(conf);
dfs.rename(from, to);
Run Code Online (Sandbox Code Playgroud)
在哪里from和to是org.apache.hadoop.fs.Path对象.最简单的方法是创建要重命名的文件列表(包括其新名称),并将此列表提供给Java程序.
我已经发布了完整的实现,它从中读取了这样的映射STDIN.它在不到4秒的时间内重命名了100个文件(同样需要重命名7000个文件!),而hdfs dfs -mv之前描述的基于方法需要4 分钟来重命名100个文件.