如何重命名hdfs目录中的所有文件以获得 .lzo 分机? .lzo.index 不应重命名文件。例如,此目录列表:
.lzo
.lzo.index
file0.lzo file0.lzo.index file0.lzo_copy_1
可以重命名为:
file0.lzo file0.lzo.index file0.lzo_copy_1.lzo
这些文件是lzo压缩的,我需要它们有 .lzo hadoop要识别的扩展。
56lgkhnf1#
我们创建了一个实用程序来批量重命名hdfs中的文件:https://github.com/tenaris/hdfs-rename. 这个工具是有限的,但是如果你想要的话,你可以用递归、awk regex语法等等来改进它。
gcuhipw92#
当我不得不重命名许多文件时,我正在寻找一个有效的解决方案,无意中发现了这个问题和thi duong nguyen关于重命名许多文件非常慢的评论。我实现了一个用于批量重命名操作的java解决方案,我强烈建议使用它,因为它的速度要快几个数量级。基本思想是 org.apache.hadoop.fs.FileSystem 的 rename() 方法:
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);
哪里 from 以及 to 是 org.apache.hadoop.fs.Path 物体。最简单的方法是创建一个要重命名的文件列表(包括它们的新名称),并将这个列表提供给java程序。我已经发布了从 STDIN . 它在不到4秒内重命名了100个文件(重命名7000个文件需要相同的时间!)而 hdfs dfs -mv 基于前面描述的方法需要4分钟来重命名100个文件。
from
to
org.apache.hadoop.fs.Path
STDIN
hdfs dfs -mv
hgc7kmma3#
如果您不想为此编写java代码,我认为使用命令行hdfs api是最好的选择: mv 在hadoop中 hadoop fs -mv URI [URI …] <dest> 您可以使用一个小的单行线获得路径:
mv
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 ...
这个 awk 将从输出中删除目录..现在可以将这些文件放入变量中:
awk
% files=$(hadoop fs -ls /user/foo/bar | awk '!/^d/ {print $8}')
并重命名每个文件。。
% for f in $files; do hadoop fs -mv $f $f.lzo; done
你也可以使用 awk 为其他条件筛选文件。这将删除与regex匹配的文件 nolzo . 但是它还没有经过测试。但是这样你就可以编写灵活的过滤器了。
nolzo
% files=$(hadoop fs -ls /user/foo/bar | awk '!/^d|nolzo/ {print $8}' )
测试是否与更换 hadoop 命令 echo :
hadoop
echo
$ for f in $files; do echo $f $f.lzo; done
编辑:要使用的更新示例 awk 而不是 sed 更可靠的输出。正确的方法可能是使用hdfs java api。。不过,对于大多数工作来说,使用shell可能更快、更灵活。
sed
3条答案
按热度按时间56lgkhnf1#
我们创建了一个实用程序来批量重命名hdfs中的文件:https://github.com/tenaris/hdfs-rename. 这个工具是有限的,但是如果你想要的话,你可以用递归、awk regex语法等等来改进它。
gcuhipw92#
当我不得不重命名许多文件时,我正在寻找一个有效的解决方案,无意中发现了这个问题和thi duong nguyen关于重命名许多文件非常慢的评论。我实现了一个用于批量重命名操作的java解决方案,我强烈建议使用它,因为它的速度要快几个数量级。基本思想是
org.apache.hadoop.fs.FileSystem
的rename()
方法:哪里
from
以及to
是org.apache.hadoop.fs.Path
物体。最简单的方法是创建一个要重命名的文件列表(包括它们的新名称),并将这个列表提供给java程序。我已经发布了从
STDIN
. 它在不到4秒内重命名了100个文件(重命名7000个文件需要相同的时间!)而hdfs dfs -mv
基于前面描述的方法需要4分钟来重命名100个文件。hgc7kmma3#
如果您不想为此编写java代码,我认为使用命令行hdfs api是最好的选择:
mv
在hadoop中hadoop fs -mv URI [URI …] <dest>
您可以使用一个小的单行线获得路径:这个
awk
将从输出中删除目录..现在可以将这些文件放入变量中:并重命名每个文件。。
你也可以使用
awk
为其他条件筛选文件。这将删除与regex匹配的文件nolzo
. 但是它还没有经过测试。但是这样你就可以编写灵活的过滤器了。测试是否与更换
hadoop
命令echo
:编辑:要使用的更新示例
awk
而不是sed
更可靠的输出。正确的方法可能是使用hdfs java api。。不过,对于大多数工作来说,使用shell可能更快、更灵活。