共计 1953 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章主要为大家展示了“MapReduce 中文件名通配与过滤的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“MapReduce 中文件名通配与过滤的示例分析”这篇文章吧。
1、通配符的使用与简介
在一步操作中处理批量文件,这个要求很常见。举例来说,处理日志的 MapReduce 作业可能会分析一个月的文件,这些文件被包含在大量目录中。Hadoop 有一个通配的操作,可以方便地使用通配符在一个表达式中核对多个文件,不需要列举每个文件和目录来指定输入。Hadoop 为执行通配提供了两个 FileSystem 方法:
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}
或选择
匹配包含 a 或 b 中的一个的语句
\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
2、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$)
)
以上是“MapReduce 中文件名通配与过滤的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!