MapReduce 中的文件名通配與過濾

一、通配符的使用與簡介

在一步操做中處理批量文件,這個要求很常見。舉例來講,處理日誌的MapReduce做業可能會分析一個月的文件,這些文件被包含在大量目錄中。Hadoop有一個通配的操做,能夠方便地使用通配符在一個表達式中核對多個文件,不須要列舉每一個文件和目錄來指定輸入。Hadoop爲執行通配提供了兩個FileSystem方法: java

public FileStatus[] globStatus(Path pathPattern) throws IOException  

public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException
globStatus()返回了其路徑匹配於所供格式的FileStatus對象數組,按路徑排序。可選的PathFilter命令能夠進一步指定限制匹配。
Hadoop支持的一系列通配符與Unix bash相同(見表3-2)。
表3-2:通配符及其做用

通配符 正則表達式

名稱 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}

或選擇

匹配包含ab中的一個的語句

\c

轉義字符

匹配元字符c


假設有日誌文件存儲在按日期分層組織的目錄結構中。如此一來,即可以假設2007年最後一天的日誌文件就會以/2007/12/31的命名存入目錄。假設整個文件列表以下:
/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


二、PathFilter對象

通配格式不是總可以精確地描述咱們想要訪問的文件集合。好比,使用通配格式排除一個特定的文件就不太可能。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$")
)

三、Referer:

http://stackoverflow.com/questions/17618535/filestatus-use-to-recurse-directory

相關文章
相關標籤/搜索