2015-12-04 33 views
0

我需要使用Java/Scala程序在HDFS中移動對應於給定正則表達式的多個文件。例如,我必須將名稱爲*.xml的所有文件從文件夾a移動到文件夾bHDFS:使用Java/Scala API移動多個文件

使用外殼命令我可以使用以下:

bin/hdfs dfs -mv a/*.xml b/ 

我可以FileSystem類使用Java API,用下面的代碼(Scala語言)移動單個文件,使用rename方法:

// 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中移動一組文件?

回答

2

您可以使用fs.rename(new Path("a"), new Path("b"))

但是,如果你想有*.xml有過濾器文件,如globfilter。

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> 
} 
+1

謝謝你的回答。實現我所需要的另一種方法是使用接受「路徑」和「路徑過濾器」的方法'listStatus',它允許您過濾列表的結果。 –

+0

我們在哪裏可以找到我們可以使用fs執行的命令列表?任何指針,如fs.rename fs.globStatus等等。在此先感謝 – Dileep

+0

我在尋找正確的鏈接[鏈接](https://hadoop.apache.org/docs/r2.6.1/api/org/apache/hadoop/fs/FileSystem.html)? – Dileep