MapReduce中文件名通配与过滤

目录[-]

  • 1、通配符的使用与简介
  • 2、PathFilter对象
  • 3、Referer:
  • 1、通配符的使用与简介

    在一步操作中处理批量文件,这个要求很常见。举例来说,处理日志的MapReduce作业可能会分析一个月的文件,这些文件被包含在大量目录中。Hadoop有一个通配的操作,可以方便地使用通配符在一个表达式中核对多个文件,不需要列举每个文件和目录来指定输入。Hadoop为执行通配提供了两个FileSystem方法:

    ?
    1
    2
    3
    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:通配符及其作用

    通配符

    名称

    匹配

    *

    星号

    匹配0或多个字符

    问号

    匹配单一字符

    [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的命名存入目录。假设整个文件列表如下:
    ?
    1
    2
    3
    4
    / 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


    2、PathFilter对象

    通配格式不是总能够精确地描述我们想要访问的文件集合。比如,使用通配格式排除一个特定的文件就不太可能。FileSystem中的listStatus()和globStatus()方法提供了可选的PathFilter对象,使我们能够通过编程方式控制匹配:

    ?
    1
    2
    3
    4
    5
    package org.apache.hadoop.fs; 
      
    public interface PathFilter { 
        boolean accept(Path path);
    }

    PathFilter与java.io.FileFilter一样,是Path对象而不是File对象。

    例3-7:展示了一个PathFilter,用于排除匹配一个正则表达式的路径。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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); 
      
    }
    这个过滤器只留下与正则表达式不同的文件。我们将它与预先剔除一些文件集合的通配配合:过滤器用来优化结果。例如:
    ?
    1
    2
    3
    fs.globStatus( new Path( "/2007/*/*" ),  
                    new RegexExcludeFilter( "^.*/2007/12/31$" )
    )

    你可能感兴趣的:(MapReduce中文件名通配与过滤)