在一步操做中處理批量文件,這個要求很常見。舉例來講,處理日誌的MapReduce做業可能會分析一個月的文件,這些文件被包含在大量目錄中。Hadoop有一個通配的操做,能夠方便地使用通配符在一個表達式中核對多個文件,不須要列舉每一個文件和目錄來指定輸入。Hadoop爲執行通配提供了兩個FileSystem方法: java
public FileStatus[] globStatus(Path pathPattern) throws IOException public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOExceptionglobStatus()返回了其路徑匹配於所供格式的FileStatus對象數組,按路徑排序。可選的PathFilter命令能夠進一步指定限制匹配。
通配符 正則表達式 |
名稱 apache |
匹配 編程 |
* 數組 |
星號 bash |
匹配0或多個字符 oop |
? 優化 |
問號 this |
匹配單一字符 spa |
[ab] |
字符類別 |
匹配{a,b}中的一個字符 |
續表
通配符 |
名稱 |
匹配 |
[^ab] |
非字符類別 |
匹配不是{a,b}中的一個字符 |
[a-b] |
字符範圍 |
匹配一個在{a,b}範圍內的 字符(包括ab),a在字典 順序上要小於或等於b |
[^a-b] |
非字符範圍 |
匹配一個不在{a,b}範圍內 的字符(包括ab),a在字 典順序上要小於或等於b |
{a,b} |
或選擇 |
匹配包含a或b中的一個的語句 |
\c |
轉義字符 |
匹配元字符c |
/2007/12/30 /2007/12/31 /2008/01/01 /2008/01/02
如下是一些文件通配符及其擴展。
通配符 |
擴展 |
/* |
/2007/2008 |
/*/* |
/2007/12 /2008/01 |
/*/12/* |
/2007/12/30 /2007/12/31 |
/200? |
/2007 /2008 |
/200[78] |
/2007 /2008 |
/200[7-8] |
/2007 /2008 |
/200[^01234569] |
/2007 /2008 |
/*/*/{31,01} |
/2007/12/31 /2008/01/01 |
/*/*/3{0,1} |
/2007/12/30 /2007/12/31 |
/*/{12/31,01/01} |
/2007/12/31 /2008/01/01 |
通配格式不是總可以精確地描述咱們想要訪問的文件集合。好比,使用通配格式排除一個特定的文件就不太可能。FileSystem中的listStatus()和globStatus()方法提供了可選的PathFilter對象,使咱們可以經過編程方式控制匹配:
package org.apache.hadoop.fs; public interface PathFilter { boolean accept(Path path); }
PathFilter與java.io.FileFilter同樣,是Path對象而不是File對象。
例3-7:展現了一個PathFilter,用於排除匹配一個正則表達式的路徑。
public class RegexExcludePathFilter implements PathFilter { private final String regex; public RegexExcludePathFilter(String regex) { this.regex = regex; } public boolean accept(Path path) { return !path.toString().matches(regex); } }這個過濾器只留下與正則表達式不一樣的文件。咱們將它與預先剔除一些文件集合的通配配合:過濾器用來優化結果。例如:
fs.globStatus( new Path("/2007/*/*"), new RegexExcludeFilter("^.*/2007/12/31$") )
http://stackoverflow.com/questions/17618535/filestatus-use-to-recurse-directory