不多说,直接上代码。

代码

package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
/**
* @function 将指定格式的多个文件上传至 HDFS
*
*
*/
public class CopyManyFilesToHDFS {

private static FileSystem fs = null;
private static FileSystem local = null;

/**
* @function Main 方法
* @param args
* @throws IOException
* @throws URISyntaxException
*/
public static void main(String[] args) throws IOException,URISyntaxException
{
//文件源路径 这是在 Windows 下测试运行,如果在 Linux 修改srcPath路径即可
String srcPath = "/home/hadoop/data/*";
//String srcPath = "D://Data/testdata/*";
//或者Path srcPath =new Path("D://Data/testdata/*");


//文件目的路径 如果在 Hadoop 环境下运行,使用 dstPath 的相对路径"/copyManyFilesToHDFS/"也可以
String dstPath = "hdfs://HadoopMaster:9000/copyManyFilesToHDFS/";
//或者Path dstPath = new Path("hdfs://HadoopMaster:9000/copyManyFilesToHDFS/");
//调用文件上传 list 方法
list(srcPath,dstPath);
}

/**
* function 过滤文件格式 将多个文件上传至 HDFS
* @param dstPath 目的路径
* @throws IOException
* @throws URISyntaxException
*/
//2.接下来在 list 方法中,使用 globStatus 方法获取所有 txt 文件,然后通过 copyFromLocalFile 方法将文件上传至 HDFS。
public static void list(String srcPath,String dstPath) throws IOException, URISyntaxException {
//读取hadoop配置文件
Configuration conf = new Configuration();

//获取默认文件系统 在Hadoop 环境下运行,也可以使用此种方法获取文件系统
fs = FileSystem.get(conf);

//HDFS接口和获取文件系统对象,本地环境运行模式
//URI uri = new URI("hdfs://HadoopMaster:9000");
//fs = FileSystem.get(uri, conf);
//获得本地文件系统
local = FileSystem.getLocal(conf);
//只上传Data/testdata 目录下 txt 格式的文件 ,获得文件目录,即D://Data/testdata/
//FileStatus[] localStatus = local.globStatus(new Path("D://Data/testdata/*"),new RegexAcceptPathFilter("^.*txt$"));
FileStatus[] localStatus = local.globStatus(new Path("/home/hadoop/data/*"),new RegexAcceptPathFilter("^.*txt$"));
// 获得所有文件路径
Path[] listedPaths = FileUtil.stat2Paths(localStatus);
Path out= new Path(dstPath);
//循坏所有文件
for(Path p:listedPaths)
{
//将本地文件上传到HDFS
fs.copyFromLocalFile(p, out);
}
}

/**
* @function 只接受 txt 格式的文件
* @author
*
*/
// 1.首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
public static class RegexAcceptPathFilter implements PathFilter
{
private final String regex;

public RegexAcceptPathFilter(String regex)
{
this.regex = regex;
}
// 如果要接收 regex 格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。

public boolean accept(Path path)
{
// TODO Auto-generated method stub
boolean flag = path.toString().matches(regex);
//只接受 regex 格式的文件
return flag;
}
}
}

在Hadoop集群里测试的代码版本

package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
/**
* @function 将指定格式的多个文件上传至HDFS,在Hadoop集群里测试

*
*/
public class CopyManyFilesToHDFS
{

private static FileSystem fs = null;//定义文件系统对象,是HDFS上的
private static FileSystem local = null; //定义文件系统对象,是本地上的

/**
* @function Main 方法
* @param args //@param args是生成文档的时候用的东西,现在不用管。以后慢慢就知道了
* @throws IOException
* @throws URISyntaxException
*/
public static void main(String[] args) throws IOException,URISyntaxException
{
//文件的原路径,这是在Windows下测试运行,如果在 Linux 修改srcPath路径即可
String srcPath = "/home/hadoop/djt/data/*";
//String srcPath = "D://Data/testdata/*";
//或者Path srcPath =new Path("D://Data/testdata/*");


//文件目的路径 如果在 Hadoop 环境下运行,使用 dstPath 的相对路径"/middle/filter/"也可以
String dstPath = "hdfs://HadoopMaster:9000/middle/filter/";
//或者Path dstPath = new Path("hdfs://HadoopMaster:9000/middle/filter/");
//调用文件上传 list 方法
list(srcPath,dstPath);
}

/**
* function 过滤文件格式 将多个文件上传至 HDFS
* @param dstPath 目的路径
* @throws IOException
* @throws URISyntaxException
*/
//2.接下来在 list 方法中,使用 globStatus 方法获取所有 txt 文件,然后通过 copyFromLocalFile 方法将文件上传至 HDFS。
public static void list(String srcPath,String dstPath) throws IOException, URISyntaxException
{
Configuration conf = new Configuration();//读取hadoop配置文件
fs = FileSystem.get(conf);//获取默认文件系统对象,fs。 在Hadoop 环境下运行,也可以使用此种方法获取文件系统
//URI uri = new URI("hdfs://HadoopMaster:9000");//HDFS接口和获取文件系统对象,本地环境运行模式
//fs = FileSystem.get(uri, conf);
local = FileSystem.getLocal(conf);//获得本地文件系统对象,local
//只上传Data/testdata 目录下 txt 格式的文件 ,获得文件目录,即D://Data/testdata/
//FileStatus[] localStatus = local.globStatus(new Path("D://Data/testdata/*"),new RegexAcceptPathFilter("^.*txt$"));
FileStatus[] localStatus = local.globStatus(new Path("/home/hadoop/djt/data/*"),new RegexAcceptPathFilter("^.*txt$"));//接收目录下的 txt 文件
// 获得所有文件路径
Path[] listedPaths = FileUtil.stat2Paths(localStatus);
Path out= new Path(dstPath);
//循坏所有文件
for(Path p:listedPaths)
{
//将本地文件上传到HDFS
fs.copyFromLocalFile(p, out);
}
}

/**
* @function 只接受 txt 格式的文件
* @author
*
*/
// 1.首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
public static class RegexAcceptPathFilter implements PathFilter
{
private final String regex;

public RegexAcceptPathFilter(String regex)
{
this.regex = regex;
}
// 如果要接收 regex 格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
@Override
public boolean accept(Path path)
{
// TODO Auto-generated method stub
boolean flag = path.toString().matches(regex);
//只接受 regex 格式的文件
return flag;
}
}
}

在Eclipse/MyEclipse集群里测试的代码版本

package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
/**
* @function 将指定格式的多个文件上传至 HDFS,在MyEclipse里测试
* @author 小讲
*
*/
public class CopyManyFilesToHDFS {


private static FileSystem fs = null;//定义文件系统对象,是HDFS上的
private static FileSystem local = null;//定义文件系统对象,是本地上的

/**
* @function Main 方法
* @param args
* @throws IOException
* @throws URISyntaxException
*/
public static void main(String[] args) throws IOException,URISyntaxException
{
//文件源路径 这是在 Windows 下测试运行,如果在 Linux 修改srcPath路径即可
String srcPath = "D://data/testdata/*";
//或者Path srcPath =new Path("D://Data/testdata/*");

//文件目的路径 如果在 Hadoop 环境下运行,使用 dstPath 的相对路径"/middle/filter/"也可以
String dstPath = "hdfs://HadoopMaster:9000/middle/filter/";
//或者Path dstPath = new Path("hdfs://HadoopMaster:9000/middle/filter/");
//调用文件上传 list 方法
list(srcPath,dstPath);
}

/**
* function 过滤文件格式 将多个文件上传至 HDFS
* @param dstPath 目的路径
* @throws IOException
* @throws URISyntaxException
*/
//2.接下来在 list 方法中,使用 globStatus 方法获取所有 txt 文件,然后通过 copyFromLocalFile 方法将文件上传至 HDFS。
public static void list(String srcPath,String dstPath) throws IOException, URISyntaxException
{
//读取hadoop配置文件
Configuration conf = new Configuration();

//获取默认文件系统 在Hadoop 环境下运行,也可以使用此种方法获取文件系统
//fs = FileSystem.get(conf);

//HDFS接口和获取文件系统对象,本地环境运行模式
URI uri = new URI("hdfs://HadoopMaster:9000");
fs = FileSystem.get(uri, conf);

local = FileSystem.getLocal(conf);//获得本地文件系统
//只上传Data/testdata 目录下 txt 格式的文件 ,获得文件目录,即D://Data/testdata/
FileStatus[] localStatus = local.globStatus(new Path("D://Data/testdata/*"),new RegexAcceptPathFilter("^.*txt$"));
// 获得所有文件路径
Path[] listedPaths = FileUtil.stat2Paths(localStatus);
Path out= new Path(dstPath);
//循坏所有文件
for(Path p:listedPaths)
{
//将本地文件上传到HDFS
fs.copyFromLocalFile(p, out);
}
}

/**
* @function 只接受 txt 格式的文件
* @author
*
*/
// 1.首先定义一个类 RegexAcceptPathFilter实现 PathFilter,过滤掉 txt 文本格式以外的文件。
public static class RegexAcceptPathFilter implements PathFilter
{
private final String regex;

public RegexAcceptPathFilter(String regex)
{
this.regex = regex;
}
// 如果要接收 regex 格式的文件,则accept()方法就return flag; 如果想要过滤掉regex格式的文件,则accept()方法就return !flag。
@Override
public boolean accept(Path path)
{
// TODO Auto-generated method stub
boolean flag = path.toString().matches(regex);
//只接受 regex 格式的文件
return flag;
}
}
}

Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)的更多相关文章

  1. Hadoop HDFS编程 API入门系列之从本地上传文件到HDFS(一)

    不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs5; import java.io.IOException; import ja ...

  2. Hadoop MapReduce编程 API入门系列之多个Job迭代式MapReduce运行(十二)

    推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...

  3. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  4. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本3(九)

    不多说,直接上干货! 下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 下面是版本2. Hadoop MapReduce编程 API入门系列之挖掘气象数 ...

  5. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本2(十)

    下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 这篇博文,包括了,实际生产开发非常重要的,单元测试和调试代码.这里不多赘述,直接送上代码. MRUni ...

  6. Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)

    不多说,直接上代码.  代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7; import java.io.IOException;import ja ...

  7. Hadoop HDFS编程 API入门系列之HdfsUtil版本2(七)

    不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs1; import java.io.FileInputStream;import ...

  8. Hadoop HDFS编程 API入门系列之HdfsUtil版本1(六)

    不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs2; import java.io.FileOutputStream;impor ...

  9. Hadoop MapReduce编程 API入门系列之join(二十六)(未完)

    不多说,直接上代码. 天气记录数据库 Station ID Timestamp Temperature 气象站数据库 Station ID Station Name 气象站和天气记录合并之后的示意图如 ...

随机推荐

  1. Struts 2之动态方法调用,不会的赶紧来

    学习Struts2框架以来为了减少Action 的数量,我们可以使用动态方法进行处理. 动态方法调用(Dynamic Method Invocation,DMI)是指表单元素的Action并不是直接等 ...

  2. Eos持久化实体

    持久化实体 2009-11-30 20:53:38|  分类: 记事本_学习笔记 |  标签: |举报 |字号大中小 订阅     在EOS的实体定义中,如果使用了关联实体方式,主实体的外键属性是不存 ...

  3. Activity 属性设置大全

    activity属性设置大全 android:allowTaskReparenting=["true"|"false"] 是否允许activity更换从属的任务 ...

  4. UE4 VR 模式下全屏解决办法

    方法步骤: 1.打开关卡蓝图添加如下代码: 2.设置配置文件在工程目录里面找到 Config 文件夹在里面添加一个配置文件并命名为 DefaultGameUserSettings.ini 把如下内容贴 ...

  5. asp.net 前台通过Eval()绑定动态显示样式

    1.a标签链接 <%#Eval("ConfigCode").ToString().ToLower() == "publishtext" ? "& ...

  6. LintCode Search For a Range (Binary Search)

    Binary Search模板: mid 和 target 指针比较,left/ right 和 target 比较. 循环终止条件: 最后剩两数比较(while(left + 1 < righ ...

  7. Appium 解决不能输入中文字符问题

    只需在初始化driver方法时,写这两行代码即可:   capabilities.setCapability("unicodeKeyboard", "True" ...

  8. js实现cookie记住密码

    近来做记住密码时,用js的实现方式做了一下. login.jsp页面代码 <%@ page language="java" import="java.util.*& ...

  9. 【渗透测试学习平台】 web for pentester -4.XML

    example1: http://192.168.91.139/xml/example1.php?xml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%2 ...

  10. HDU 4471 矩阵快速幂 Homework

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 解题思路,矩阵快速幂····特殊点特殊处理····· 令h为计算某个数最多须知前h个数,于是写 ...