Hadoop和spark中读取文件通配符使用举例

来源:互联网 发布:bp神经网络 遗传算法 编辑:程序博客网 时间:2024/06/07 15:14

在单个操作中处理一批文件,这是一个常见的要求。举例来说,处理日志的MapReduce作业可能需要分析一个月内包含在大量目录中的日志文件。在一个表达式中使用通配符来匹配多个文件是比较方便的,无需列举第个文件 和目录来指定输入,该操作称为”通配”(globbing)。Hadoop 为执行通配提供了两个FileSystem方法:

public FileStatus[] globStatus(Path pathPattern) throws IOExceptionpublic FileStatus[] globStatus(Paht pathPattern , PathFileter filter) throws IOException

globStatus()方法返回与路径相匹配的所有文件的 FileStatus 对象数组,并按路径排序。PathFilter命令作为可选项可以进一步对匹配进行限制。

Hadoop支持的通配符与Unix bash相同

表1 通配符及其含义

通配符 名称 匹配 * 星号 匹配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

假设有日志文件存储按照日期分层组织的目录结构中。如此一来,2017年最后一天的日志文件就会存在以2017/12/31命名的目录中。假设整个文件目录文件列表如下:

  • /2017/12/30
  • /2017/12/31
  • /2018/01/01
  • /2018/01/02

一些文件通配符及其扩展如下所示:

通配符 扩展 /* /2017 /2018 /*/* /2017/12 /2018/01 /*/12/* /2017/12/30 /2017/12/31 /201? /2017 /2018 /201[78] /2017 /2018 /201[7-8] /2017 /2018 /201[^01234569] /2017 /2018 /*/*/{31,01} /2017/12/31/ 2018/01/01 /*/*/3{0,1} /2017/12/30 /2017/12/31 /*/{12/31,01/01} /2017/12/31 /2018/01/01

– 以上载自《Hadoop权威指南》

原创粉丝点击