首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >hadoop中的批重命名

hadoop中的批重命名
EN

Stack Overflow用户
提问于 2013-02-06 18:17:46
回答 2查看 12.5K关注 0票数 6

如何将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识别。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-06 18:32:52

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

在Hadoop

hadoop fs -mv URI [URI …] <dest>

您可以使用一个小的衬垫获得路径:

代码语言:javascript
运行
复制
% hadoop fs -ls /user/foo/bar | awk  '!/^d/ {print $8}'

/user/foo/bar/blacklist
/user/foo/bar/books-eng
...

awk将从output..now中删除目录,您可以将这些文件放入变量中:

代码语言:javascript
运行
复制
% files=$(hadoop fs -ls /user/foo/bar | awk  '!/^d/ {print $8}')

并重命名每个文件..。

代码语言:javascript
运行
复制
% for f in $files; do hadoop fs -mv $f $f.lzo; done

您还可以使用awk筛选其他条件的文件。这将删除与regex nolzo匹配的文件。不过,它还没有经过测试。但是这样你就可以编写灵活的过滤器了。

代码语言:javascript
运行
复制
% files=$(hadoop fs -ls /user/foo/bar | awk  '!/^d|nolzo/ {print $8}' )

测试它是否适用于用hadoop替换echo命令

代码语言:javascript
运行
复制
$ for f in $files; do echo $f $f.lzo; done

编辑:更新的示例使用awk而不是sed来实现更可靠的输出。

这样做的“正确”方式可能是使用HDFS Java API。然而,对于大多数工作来说,使用shell可能更快、更灵活。

票数 15
EN

Stack Overflow用户

发布于 2014-12-16 20:23:34

当我不得不重命名许多文件时,我正在寻找一个有效的解决方案,并无意中发现了这个问题和诗独燕关于重命名许多文件的说法非常缓慢。我为批重命名操作实现了一个org.apache.hadoop.fs.FileSystem解决方案,我可以强烈推荐,因为它的速度要快几个数量级。基本思想是使用org.apache.hadoop.fs.FileSystemrename()方法:

代码语言:javascript
运行
复制
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:8020");
FileSystem dfs = FileSystem.get(conf);
dfs.rename(from, to);

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

已发表是从STDIN读取这样一个映射的完整实现。它在不到4秒的时间内重命名了100个文件(同时需要重命名7000个文件!)而前面描述的基于hdfs dfs -mv的方法需要4分钟才能重命名100个文件。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14736017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档