在hadoop中批量重命名

bee*_*alo 6 bash hadoop file-rename

如何重命名hdfs目录中的所有文件以获得.lzo扩展名?.lzo.index不应重命名文件.

例如,此目录列表:

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 
Run Code Online (Sandbox Code Playgroud)

这些文件是lzo压缩的,我需要它们才能让.lzohadoop识别扩展名.

mt_*_*mt_ 13

如果您不想为此编写Java代码 - 我认为使用命令行HDFS API是您最好的选择:

mv 在Hadoop中

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可能更快,更灵活.

  • 这可行,但是如果要重命名成千上万个文件,这将非常慢。 (2认同)

Rob*_*ert 8

当我不得不重命名许多文件时,我正在寻找一个有效的解决方案,并且偶然发现了这个问题和thi-duong-nguyen的重写多个文件的说法很慢.我为批量重命名操作实现了一个Java解决方案,我强烈建议,因为它速度要快几个数量级.其基本思想是使用org.apache.hadoop.fs.FileSystemrename()方法:

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)

在哪里fromtoorg.apache.hadoop.fs.Path对象.最简单的方法是创建要重命名的文件列表(包括其新名称),并将此列表提供给Java程序.

已经发布了完整的实现,它从中读取了这样的映射STDIN.它在不到4秒的时间内重命名了100个文件(同样需要重命名7000个文件!),而hdfs dfs -mv之前描述的基于方法需要4 分钟来重命名100个文件.