如何将hdfs目录中的所有文件重命名为具有.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识别。
发布于 2013-02-06 18:32:52
如果您不想为此编写Java代码--我认为使用命令行HDFS是最好的选择:
在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
...
awk
将从output..now中删除目录,您可以将这些文件放入变量中:
% 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
匹配的文件。不过,它还没有经过测试。但是这样你就可以编写灵活的过滤器了。
% files=$(hadoop fs -ls /user/foo/bar | awk '!/^d|nolzo/ {print $8}' )
测试它是否适用于用hadoop
替换echo
命令
$ for f in $files; do echo $f $f.lzo; done
编辑:更新的示例使用awk
而不是sed
来实现更可靠的输出。
这样做的“正确”方式可能是使用HDFS Java API。然而,对于大多数工作来说,使用shell可能更快、更灵活。
发布于 2014-12-16 20:23:34
当我不得不重命名许多文件时,我正在寻找一个有效的解决方案,并无意中发现了这个问题和诗独燕关于重命名许多文件的说法非常缓慢。我为批重命名操作实现了一个org.apache.hadoop.fs.FileSystem
解决方案,我可以强烈推荐,因为它的速度要快几个数量级。基本思想是使用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个文件。
https://stackoverflow.com/questions/14736017
复制相似问题