這篇文章主要為大家展示了“MapReduce中文件名通配與過濾的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“MapReduce中文件名通配與過濾的示例分析”這篇文章吧。
創(chuàng)新互聯(lián)建站主營任縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),任縣h5微信小程序開發(fā)搭建,任縣網(wǎng)站營銷推廣歡迎任縣等地區(qū)企業(yè)咨詢
在一步操作中處理批量文件,這個(gè)要求很常見。舉例來說,處理日志的MapReduce作業(yè)可能會(huì)分析一個(gè)月的文件,這些文件被包含在大量目錄中。Hadoop有一個(gè)通配的操作,可以方便地使用通配符在一個(gè)表達(dá)式中核對多個(gè)文件,不需要列舉每個(gè)文件和目錄來指定輸入。Hadoop為執(zhí)行通配提供了兩個(gè)FileSystem方法:
public FileStatus[] globStatus(Path pathPattern) throws IOException public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException
globStatus()返回了其路徑匹配于所供格式的FileStatus對象數(shù)組,按路徑排序。可選的PathFilter命令可以進(jìn)一步指定限制匹配。
Hadoop支持的一系列通配符與Unix bash相同(見表3-2)。
表3-2:通配符及其作用
通配符 | 名稱 | 匹配 |
* | 星號(hào) | 匹配0或多個(gè)字符 |
? | 問號(hào) | 匹配單一字符 |
[ab] | 字符類別 | 匹配{a,b}中的一個(gè)字符 |
續(xù)表
通配符 | 名稱 | 匹配 |
[^ab] | 非字符類別 | 匹配不是{a,b}中的一個(gè)字符 |
[a-b] | 字符范圍 | 匹配一個(gè)在{a,b}范圍內(nèi)的 字符(包括ab),a在字典 順序上要小于或等于b |
[^a-b] | 非字符范圍 | 匹配一個(gè)不在{a,b}范圍內(nèi) 的字符(包括ab),a在字 典順序上要小于或等于b |
{a,b} | 或選擇 | 匹配包含a或b中的一個(gè)的語句 |
\c | 轉(zhuǎn)義字符 | 匹配元字符c
|
假設(shè)有日志文件存儲(chǔ)在按日期分層組織的目錄結(jié)構(gòu)中。如此一來,便可以假設(shè)2007年最后一天的日志文件就會(huì)以/2007/12/31的命名存入目錄。假設(shè)整個(gè)文件列表如下:
/2007/12/30 /2007/12/31 /2008/01/01 /2008/01/02
以下是一些文件通配符及其擴(kuò)展。
通配符 | 擴(kuò)展 |
/* | /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
|
通配格式不是總能夠精確地描述我們想要訪問的文件集合。比如,使用通配格式排除一個(gè)特定的文件就不太可能。FileSystem中的listStatus()和globStatus()方法提供了可選的PathFilter對象,使我們能夠通過編程方式控制匹配:
package org.apache.hadoop.fs; public interface PathFilter { boolean accept(Path path); }
PathFilter與java.io.FileFilter一樣,是Path對象而不是File對象。
例3-7:展示了一個(gè)PathFilter,用于排除匹配一個(gè)正則表達(dá)式的路徑。
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); } }
這個(gè)過濾器只留下與正則表達(dá)式不同的文件。我們將它與預(yù)先剔除一些文件集合的通配配合:過濾器用來優(yōu)化結(jié)果。例如:
fs.globStatus( new Path("/2007/*/*"), new RegexExcludeFilter("^.*/2007/12/31$") )
以上是“MapReduce中文件名通配與過濾的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!