2017-07-27 65 views
0

我使用Hadoop的FileSystemorg.apache.hadoop.fs.FileSystem)遞歸列出所有的目錄下的文件:跳過符號鏈接而遞歸地列出文件使用Hadoop的文件系統

FileSystem.listFiles(new Path("file:/my/path"), true) 

不過,我有一個遞歸符號鏈接/my/path/symlink -> /my/pathlistFiles回報一個巨大的路徑列表如

/my/path/symlink 
/my/path/symlink/symlink 
/my/path/symlink/symlink/symlink 
/my/path/symlink/symlink/symlink/symlink 
/my/path/symlink/symlink/symlink/symlink/symlink 
... 

是否有一個標誌或配置參數來防止這種情況?

我需要使用FileSystem,因爲我使用的路徑爲hdfs:/file:/

回答

1

一旦我需要在路徑下遞歸地列出目錄,並且我根據FileSystem.java中的listFiles代碼編寫了自己的listDirectories函數。

如果你看一下代碼,它非常簡單,只要你是一個符號鏈接,就應該避免在FileStatus上重複出現。但是要注意的是,你不會得到包含父符號鏈接的路徑。

你應該將這個功能改變:

private void handleFileStat(LocatedFileStatus stat) throws IOException { 
    if (stat.isFile()) { // file 
     curFile = stat; 
    } else if (recursive) { // directory 
     itors.push(curItor); 
     curItor = listLocatedStatus(stat.getPath()); 
    } 
    } 

喜歡的東西:

private void handleFileStat(LocatedFileStatus stat) throws IOException { 
    if (stat.isFile()) { // file 
     curFile = stat; 
    } else if (recursive && !stat.isSymlink()) { // directory and not symlink 
     itors.push(curItor); 
     curItor = listLocatedStatus(stat.getPath()); 
    } 
    }