FileInputFormat setInputPaths 和 採用listStatus 對比

FileInputFormat.setInputPaths(job,paths) path可以給定給一個目錄 系統會會從該目錄下找打文件作爲輸入,但是如果給定的目錄下面還有一層目錄,則系統就不會再深入一層,並且可能會提示錯誤:

13/01/22 18:12:56 WARN mapred.LocalJobRunner: job_local_0001
java.io.FileNotFoundException: File does not exist: /user/zhoulei/rule2/a
 at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.openInfo(DFSClient.java:1843)
 at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.<init>(DFSClient.java:1834)
 at org.apache.hadoop.hdfs.DFSClient.open(DFSClient.java:578)
 at org.apache.hadoop.hdfs.DistributedFileSystem.open(DistributedFileSystem.java:154)
 at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:427)
 at org.apache.hadoop.mapreduce.lib.input.LineRecordReader.initialize(LineRecordReader.java:67)
 at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:522)
 at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
 at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)

 

那這種情況如何處理,能遞歸找出該目錄下所有文件作爲輸入

這時候可以使用 如下方式 裏遞歸找出目錄下的文件

FileSystem fs = FileSystem.get(URI.create(input), conf);
  FileStatus[] status = fs.listStatus(in);
  Path[] paths = FileUtil.stat2Paths(status);
  FileInputFormat.setInputPaths(job, paths);

 

這種方式可行,真好用到了listStatus 遞歸找出目錄 並且將paths 加入Input輸入

 

但是又出現一個問題,如果我要用通配符來匹配我輸入的路徑,從而過濾我需要的一些路徑那 最好的建議是用globStatus

 

這樣可以講 path 以正則表達式的方式列出,可以進一步深入目錄 而又能過濾所需

Path in = new Path(“rule2/*”);

這樣就把當前目錄下一層的文件也取出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章