我需要使用Java / Scala程序在HDFS中移动与给定正则表达式相对应的多个文件。例如,我必须将名称为*.xml
的所有文件从文件夹a
移至文件夹b
。
使用shell命令我可以使用以下内容:
bin/hdfs dfs -mv a/*.xml b/
我可以使用Java API移动单个文件,使用以下代码(scala语言),使用rename
类上的FileSystem
方法:
// Prepare initial configuration
val conf = new Configuration()
conf.set("fs.defaultFS", "hdfs://hdfs:9000/user/root")
val fs = FileSystem.get(conf)
// Move a single file
val ok = fs.rename(new Path("a/file.xml"), new Path("b/file.xml"));
据我所知,Path
类代表一个URI。然后,我不能以下列方式使用:
val ok = fs.rename(new Path("a/*.xml"), new Path("b/"));
有没有办法通过Java / Scala API在HDFS中移动一组文件?
答案 0 :(得分:3)
您可以使用*.xml
但是如果你想拥有FileSystem fs = FileSystem.get(URI.create(arg0[0]), conf);
Path path = new Path(arg0[0] + arg0[1]); // arg0[1] NYSE_201[2-3]
//arg0[0] is base path
//ar0[1] uses regular expression
FileStatus[] status = fs.globStatus(path);
Path[] paths = FileUtil.stat2Paths(status);
for (Path p : paths) {
// <loops all the source paths>
// <need to implement logic to rename the paths using fs.rename>
}
,就会有像globfilter这样的过滤器文件。
gson