利用Java API通过路径过滤上传多文件至HDFS
在本地文件上传至HDFS过程中,很多情况下一个目录包含很多个文件,而我们需要对这些文件进行筛选,选出符合我们要求的文件,上传至HDFS。这时就需要我们用到文件模式。 在项目开始前,我们先掌握文件模式
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$");
}
利用Java API通过路径过滤上传多文件至HDFS的更多相关文章
- java调用svnkit工具类上传本地文件到svn服务器
package org.jenkinsci.plugins.svn.upload.step; import java.io.*; import org.tmatesoft.svn.core.SVNCo ...
- 【转】Java IOUtils方式上传下载文件 on HDFS
[From]https://www.cnblogs.com/areyouready/p/9795442.html package com.css.hdfs04; import java.io.File ...
- Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6; import java.io.IOException;import jav ...
- Spring学习---Spring中利用组件实现从FTP服务器上传/下载文件
FtpUtil.java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcepti ...
- 上传本地文件到HDFS
源代码: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hado ...
- 利用Python,方便局域网内上传下载文件
因为一直在用windows系统,最近需要用到linux的服务器,两个电脑之间总是需要来回拷贝文件 这样使得很繁琐,之前一直在用Python,开启一个简单的服务器,可以在另外一台同一局域网下的电脑,在线 ...
- eclipse (ADT) svn插件 过滤上传的 文件 文件夹 一劳永逸
其实很简单哈,过滤的有三种类型,1.文件.2.文件夹.3.android的target 在ADT中 window->preferences-> 会打开如下界面 ignore就是忽视的意思 ...
- Hadoop Shell命令(基于linux操作系统上传下载文件到hdfs文件系统基本命令学习)
Apache-->hadoop的官网文档命令学习:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html FS Shell 调用文件系统( ...
- flume 增量上传日志文件到HDFS中
1.采集日志文件时一个很常见的现象 采集需求:比如业务系统使用log4j生成日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs中. 1.1.根据需求,首先定义一下3大要素: 采集源 ...
随机推荐
- thinkphp路径引用问题
查看ThinkPHP\Library\Behavior\ContentReplaceBehavior.class文件,常量定义如下定义: '__ROOT__' => __ROOT__ ...
- highcharts-Highmaps 动态传入城市名称
做前端按地区(地图)分布监控数据展示用了 HIGHMAPS JAVASCRIPT MAPS 控件,很好很强大. 基础实现是这样的:调用插件动态传入需要展示的数据(data),插件会在地图数据(mapd ...
- Axure RP的版本控制
首先介绍一下Axure RP,Axure的发音是Ask-Sure,RP是Rapid Prototype的缩写,写到这里你知道了这是一款原型绘画工具.本节主要介绍Axure RP的版本管理也即Axure ...
- Junit4 架构设计系列(1): Request,ClassRequest 和 RunnerBuilder
Overall Junit的成功已不言而喻,其广泛应用于单元测试,测试驱动开发领域.大量的工具,IDE都集成了JUnit,著名的有Maven,Ant,Eclipse,甚至像Google SDK提供的A ...
- Mac os下安装pycurl
今天在Mac OS 10.9.2下安装pycurl时候失败,出现以下问题 Using curl-config (libcurl 7.30.0) clang: error: unknown argume ...
- MFC 之ActiveX控件学习
本文将介绍ActiveX控件的应用与工作原理,读者可以把ActiveX控件看成一个极小服务器的应用程序,它不能独立运行,必须要嵌入到容器程序中与容器一起运行,就像电脑主机中的显卡,它自己在电脑硬件系统 ...
- L1、L2范式及稀疏性约束
L1.L2范式及稀疏性约束 假设需要求解的目标函数为: E(x) = f(x) + r(x) 其中f(x)为损失函数,用来评价模型训练损失,必须是任意的可微凸函数,r(x)为规范化约束因子,用来对模型 ...
- Delphi基本图像处理代码
//浮雕procedure Emboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer);overload;var i, j, Gray, Azimuth ...
- 利用WITH AS 优化FILTER
SQL> explain plan for select * from fxqd_list_20131115_new where (acct_no, oper_no, seqno, trans_ ...
- WITH AS and materialize hints
WITH AS: 就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能. 如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使 ...