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/*”);
這樣就把當前目錄下一層的文件也取出。