溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

MapReduce中文件名通配與過(guò)濾的示例分析

發(fā)布時(shí)間:2021-12-16 15:02:22 來(lái)源:億速云 閱讀:170 作者:小新 欄目:云計(jì)算

這篇文章主要為大家展示了“MapReduce中文件名通配與過(guò)濾的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“MapReduce中文件名通配與過(guò)濾的示例分析”這篇文章吧。

1、通配符的使用與簡(jiǎn)介

在一步操作中處理批量文件,這個(gè)要求很常見(jiàn)。舉例來(lái)說(shuō),處理日志的MapReduce作業(yè)可能會(huì)分析一個(gè)月的文件,這些文件被包含在大量目錄中。Hadoop有一個(gè)通配的操作,可以方便地使用通配符在一個(gè)表達(dá)式中核對(duì)多個(gè)文件,不需要列舉每個(gè)文件和目錄來(lái)指定輸入。Hadoop為執(zhí)行通配提供了兩個(gè)FileSystem方法:

public FileStatus[] globStatus(Path pathPattern) throws IOException  

public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException

globStatus()返回了其路徑匹配于所供格式的FileStatus對(duì)象數(shù)組,按路徑排序??蛇x的PathFilter命令可以進(jìn)一步指定限制匹配。
Hadoop支持的一系列通配符與Unix bash相同(見(jiàn)表3-2)。
表3-2:通配符及其作用

通配符

名稱(chēng)

匹配

*

星號(hào)

匹配0或多個(gè)字符

問(wèn)號(hào)

匹配單一字符

[ab]

字符類(lèi)別

匹配{a,b}中的一個(gè)字符


續(xù)表

通配符

名稱(chēng)

匹配

[^ab]

非字符類(lèi)別

匹配不是{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è)的語(yǔ)句

\c

轉(zhuǎn)義字符

匹配元字符c


     

假設(shè)有日志文件存儲(chǔ)在按日期分層組織的目錄結(jié)構(gòu)中。如此一來(lái),便可以假設(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


     

2、PathFilter對(duì)象

通配格式不是總能夠精確地描述我們想要訪問(wèn)的文件集合。比如,使用通配格式排除一個(gè)特定的文件就不太可能。FileSystem中的listStatus()和globStatus()方法提供了可選的PathFilter對(duì)象,使我們能夠通過(guò)編程方式控制匹配:

package org.apache.hadoop.fs;  
 
public interface PathFilter {  
   boolean accept(Path path); 
}

PathFilter與java.io.FileFilter一樣,是Path對(duì)象而不是File對(duì)象。

例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è)過(guò)濾器只留下與正則表達(dá)式不同的文件。我們將它與預(yù)先剔除一些文件集合的通配配合:過(guò)濾器用來(lái)優(yōu)化結(jié)果。例如:

fs.globStatus( new Path("/2007/*/*"),   
               new RegexExcludeFilter("^.*/2007/12/31$")
)

以上是“MapReduce中文件名通配與過(guò)濾的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI