不多说,直接上代码。

 代码

package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7;

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;
import org.apache.hadoop.io.IOUtils;
/**
* function 合并小文件至 HDFS
*
*
*/
public class MergeSmallFilesToHDFS
{
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
{
list();
}

/**
*
* @throws IOException
* @throws URISyntaxException
*/
public static void list() throws IOException, URISyntaxException
{
// 读取hadoop配置文件
Configuration conf = new Configuration();
// 文件系统访问接口和创建FileSystem对象,在本地上运行模式
URI uri = new URI("hdfs://HadoopMaster:9000");
fs = FileSystem.get(uri, conf);
// 获得本地文件系统
local = FileSystem.getLocal(conf);
// 过滤目录下的 svn 文件
FileStatus[] dirstatus = local.globStatus(new Path("D://Data/tvdata/*"),new RegexExcludePathFilter("^.*svn$"));
//获取D:\Data\tvdata目录下的所有文件路径
Path[] dirs = FileUtil.stat2Paths(dirstatus);
FSDataOutputStream out = null;
FSDataInputStream in = null;
for (Path dir : dirs)
{//比如拿2012-09-17为例
//将文件夹名称2012-09-17的-去掉,直接,得到20120901文件夹名称
String fileName = dir.getName().replace("-", "");//文件名称
//只接受20120917日期目录下的.txt文件
FileStatus[] localStatus = local.globStatus(new Path(dir+"/*"),new RegexAcceptPathFilter("^.*txt$"));
// 获得20120917日期目录下的所有文件
Path[] listedPaths = FileUtil.stat2Paths(localStatus);
// 输出路径
Path block = new Path("hdfs://HadoopMaster:9000/middle/tv/"+ fileName + ".txt");
System.out.println("合并后的文件名称:"+fileName+".txt");
// 打开输出流
out = fs.create(block);
//循环20120917日期目录下的所有文件
for (Path p : listedPaths)
{
in = local.open(p);// 打开输入流
IOUtils.copyBytes(in, out, 4096, false); // 复制数据
// 关闭输入流
in.close();
}
if (out != null)
{
// 关闭输出流
out.close();
}
//当循环完20120917日期目录下的所有文件之后,接着依次20120918,20120919,,,
}
}

/**
*
* @function 过滤 regex 格式的文件
*
*/
public static class RegexExcludePathFilter implements PathFilter
{
private final String regex;

public RegexExcludePathFilter(String regex)
{
this.regex = regex;
}

public boolean accept(Path path)
{
// TODO Auto-generated method stub
boolean flag = path.toString().matches(regex);
return !flag;
}

}

/**
*
* @function 接受 regex 格式的文件
*
*/
public static class RegexAcceptPathFilter implements PathFilter
{
private final String regex;

public RegexAcceptPathFilter(String regex)
{
this.regex = regex;
}

public boolean accept(Path path)
{
// TODO Auto-generated method stub
boolean flag = path.toString().matches(regex);
return flag;
}

}
}

最新文章

  1. [转]在WPF中区别TextBlock和Label
  2. MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
  3. 嵌入式OS的现状、智能的物联网与未来的机器人
  4. hdu 3371 Connect the Cities
  5. thinkphp3.2.3 版本使用redis缓存的时候无法使用认证
  6. hdoj 3342 Legal or Not【拓扑排序】
  7. Android Notivation的使用
  8. Xcode6在10.9.4上面crash解决
  9. hadoop集群安装
  10. java 限定控制台输入值的类型
  11. Hibernate查询返回自定义VO的两种方式
  12. Vuex- Action的 { commit } {commit}是什么写法
  13. Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发WebFlux 支持两种编程风(姿)格(势) 使用@Controller这种基于注解
  14. Flutter 中 JSON 解析
  15. Linux 小知识翻译 - 「packet」(网络数据包)
  16. L老师 Shader编程教程 学习
  17. 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
  18. python 字符串、列表、字典相关内建方法
  19. mac下MySQL、MysqL workbench的安装与配置配置
  20. CF520B——Two Buttons——————【广搜或找规律】

热门文章

  1. 测试api代码,简单的接口测试代码
  2. 【LeetCode OJ】Convert Sorted Array to Binary Search Tree
  3. 黑马程序员:Java编程_反射技术
  4. WAMPSERVER 与 IIS冲突 及如何修改网站根目录
  5. WAMPSERVER多站点配置
  6. 国内较快的maven镜像
  7. POJ 3176 简单DP
  8. SCRUM项目 5.0
  9. 用JS编写日历的简单思路
  10. sublime3中文乱码解决包ConvertToUTF8.zip