不多说,直接上代码。

代码

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. HTML的总结

    一.Html简介    HTML 是一种标记语言       忽略大小写,语法宽松    使用 HTML 标记和元素,可以:       控制页面和内容的外观       发布联机文档       使 ...

  2. 十分钟了解分布式计算:GraphLab

    GraphLab是一个面向大规模机器学习/图计算的分布式内存计算框架,由CMU在2009年开始的一个C++项目,这里的内容是基于论文 Low, Yucheng, et al. "Distri ...

  3. html随记

    姓名输入框:<input type="text" value="默认有值"/> 密码输入框:<input type="text&qu ...

  4. 一个简单的Lua解释器

    #include "stdafx.h" #include<stdarg.h> #include<stdlib.h> #include<stdio.h& ...

  5. Sublog: 支持Markdown和语法高亮的跨平台博客客户端

    灵感来自米米饭 功能一览 为什么你应该试试用Sublog写博客 项目主页: sublog 使用方法: 本项目是一个插件,首先要安装Sublime Text 2 重命名sublog.sublime-se ...

  6. Android遇到的错误记录

    解决小米手机无法收到开机广播的问题 http://blog.csdn.net/ksr12333/article/details/16116627 怎样在Android Studio中打开DDMS窗口? ...

  7. .NET软件工程师面试总结

    1.手写画出系统架构图,系统代码架构,有什么技术难点?  2.手写画出系统部署图 CDN(一般购买别人的服务器会自动CDN,他们自己配置就OK啦) 3.asp.net 的session怎么实现会话共享 ...

  8. MySQL管理_数据库常用命令

    1.数据库赋权 进入mysql数据库: mysql> use mysql; 给root用户设置新密码: mysql> update user set password=password(& ...

  9. C# Ping的例子,可用于测试网络,延迟xx毫秒 C#编写网站测速

    C#编写网站测速 WebClient wcl = new WebClient(); Stopwatch spwatch = new Stopwatch(); spwatch.Start(); byte ...

  10. WeX5学习笔记-建立项目且从SVN获取版本

    UI2项目(app项目)建立步骤: 1.从网上获得WeX5_V3.1.1.zip 文件,在某盘根目录下,创建一个文件,起名尽量短小,因开发包里的文件目录层次很深,有时会报路径长度超出范围的提示,如创建 ...