利用Java API通过路径过滤上传多文件至HDFS
2016-04-16 10:18
483 查看
在本地文件上传至HDFS过程中,很多情况下一个目录包含很多个文件,而我们需要对这些文件进行筛选,选出符合我们要求的文件,上传至HDFS。这时就需要我们用到文件模式。 在项目开始前,我们先掌握文件模式
1、文件模式
在某个单一操作中处理一系列文件是很常见的。例如一个日志处理的MapReduce作业可能要分析一个月的日志量。如果一个文件一个文件或者一个目录一个目录的声明那就太麻烦了,我们可以使用通配符(wild card)来匹配多个文件(这个操作也叫做globbing)。
Hadoop提供了两种方法来处理文件组:
PathFilter
使用文件模式有时候并不能有效的描述你想要的一系列文件,例如如果你想排除某个特定文件就很难。所以FileSystem的listStatus()和globStatus()方法就提供了一个可选参数:PathFilter——它允许你一些更细化的控制匹配:
Hadoop中的匹配符与Unix中bash相同,如下图所示:、
2、数据
我们利用通配符和PathFilter 对象,将本地多种格式的文件上传至 HDFS,并过滤掉txt文本格式以外的文件
数据我随便造了些,如下
3、分析
基于需求,我们通过以下两步完成:
1、首先使用globStatus(Path pathPattern, PathFilter filter),完成文件格式过滤,获取所有 txt 格式的文件。
2、然后使用 Java API 接口 copyFromLocalFile,将所有 txt 格式的文件上传至 HDFS
4、实现
首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
如果要接收 regex格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
接下来在 uploadFile方法中,使用globStatus方法获取所有txt文件,然后通过copyFromLocalFile方法将文件上传至HDFS。
在 main() 方法在调用 uploadFile,执行多文件上传至 HDFS
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【刘超★ljc】。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
地址:下载
1、文件模式
在某个单一操作中处理一系列文件是很常见的。例如一个日志处理的MapReduce作业可能要分析一个月的日志量。如果一个文件一个文件或者一个目录一个目录的声明那就太麻烦了,我们可以使用通配符(wild card)来匹配多个文件(这个操作也叫做globbing)。
Hadoop提供了两种方法来处理文件组:
public FileStatus[] globStatus(Path pathPattern) throws IOException; public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException;
PathFilter
使用文件模式有时候并不能有效的描述你想要的一系列文件,例如如果你想排除某个特定文件就很难。所以FileSystem的listStatus()和globStatus()方法就提供了一个可选参数:PathFilter——它允许你一些更细化的控制匹配:
package org.apache.hadoop.fs; public interface PathFilter { boolean accept(Path path); }
Hadoop中的匹配符与Unix中bash相同,如下图所示:、
2、数据
我们利用通配符和PathFilter 对象,将本地多种格式的文件上传至 HDFS,并过滤掉txt文本格式以外的文件
数据我随便造了些,如下
3、分析
基于需求,我们通过以下两步完成:
1、首先使用globStatus(Path pathPattern, PathFilter filter),完成文件格式过滤,获取所有 txt 格式的文件。
2、然后使用 Java API 接口 copyFromLocalFile,将所有 txt 格式的文件上传至 HDFS
4、实现
首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
/** * @ProjectName PathFilter * @PackageName com.buaa * @ClassName RegexAcceptPathFilter * @Description 只接受符合regex的文件 * @Author 刘吉超 * @Date 2016-04-15 20:39:21 */ public static class RegexAcceptPathFilter implements PathFilter { private final String regex; public RegexAcceptPathFilter(String regex) { this.regex = regex; } @Override public boolean accept(Path path) { boolean flag = path.toString().matches(regex); // 只接受符合regex的文件 return flag; } }
如果要接收 regex格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
接下来在 uploadFile方法中,使用globStatus方法获取所有txt文件,然后通过copyFromLocalFile方法将文件上传至HDFS。
/** * 过滤文件格式 将多个文件上传至 HDFS * * @param srcPath 源路径 * @param destPath 目标路径 * @param filter 正则 * @throws URISyntaxException * @throws IOException */ public static void uploadFile(String srcPath,String destPath,String filter) throws URISyntaxException, IOException { // 读取配置文件 Configuration conf = new Configuration(); // 远端文件系统 URI uri = new URI(HDFSUri.trim()); FileSystem remote = FileSystem.get(uri,conf);; // 获得本地文件系统 FileSystem local = FileSystem.getLocal(conf); // 只上传srcPath目录下符合filter条件的文件 FileStatus[] localStatus = local.globStatus(new Path(srcPath), new RegexAcceptPathFilter(filter)); // 获得所有文件路径 Path[] listedPaths = FileUtil.stat2Paths(localStatus); if(listedPaths != null){ for(Path path : listedPaths){ // 将本地文件上传到HDFS remote.copyFromLocalFile(path, new Path(HDFSUri + destPath)); } } }
在 main() 方法在调用 uploadFile,执行多文件上传至 HDFS
public static void main(String[] args) throws IOException,URISyntaxException { // 第一个参数:代表是源路径 // 第二个参数:代表是目录路径 // 第三个参数:代表是正则,这里我们只有上传txt文件,所以正则是^.*txt$ uploadFile("D:\\data\\*","/buaa/data","^.*txt$"); }
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【刘超★ljc】。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
地址:下载
相关文章推荐
- Java中的异常机制
- leetcode-two Sum
- 蓝桥杯-动态规划-java算法训练 数字三角形
- MyEclipse 8.5 启动过程优化
- org.eclipse.swt.SWTError: No more handles的解决办法
- Java从键盘读入数据的三种常见方法
- java初级,窗口关闭与button与事件响应
- JSP实现数据库(MySQL)查询——Java Web练习(二)
- JVM(9)--Java 诊断工具:greys-anatomy
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框
- Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
- spring+hibernate 配置hibernate中的hbm.xml文件位置
- JAVA学习笔记(五)
- java泛型的使用(六)在方法中使用泛型
- java泛型的使用(五)在接口中定义泛型
- java泛型的使用(四)设置泛型的时候,只能是Number或者Number的子类(int,float)等
- java泛型的使用(三)通配符的使用
- java泛型的使用(一)定义类时,使用泛型
- JDK的命令详解操作
- Java 集合类Collection、List