`
qindongliang1922
  • 浏览: 2182536 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117481
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125867
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59866
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71256
社区版块
存档分类
最新评论

Hadoop进阶之输入路径如何正则通配?

阅读更多

在hadoop的编程中,如果你是手写MapReduce来处理一些数据,那么就避免不了输入输出参数路径的设定,hadoop里文件基类FileInputFormat提供了如下几种api来制定:




如上图,里面有
(1)addInputPath(),每次添加一个输入路径Path
(2)addInputPaths, 将多个路径以逗号分割的字符串,作为入参,支持多个路径
(3)setInputPath ,设置一个输入路径Path,会覆盖原来的路径
(4)setInputPath , 设置多个路径,支持Hadoop文件系统重写的Path对象,这在JAVA里是接口。

代码如下:

   FileInputFormat.setInputDirRecursive(job, true);//设置可以递归读取目录
			FileInputFormat.addInputPath(job, new Path("path1"));
			FileInputFormat.addInputPaths(job, "path1,path2,path3,path....");
			FileInputFormat.setInputPaths(job, new Path("path1"),new Path("path2"));
			FileInputFormat.setInputPaths(job, "path1,path2,path3,path....");



而真正用的时候,我们只需要根据业务使用上面的其中一个路径即可。
ok知道怎么,传入路径了,下面来看下,如何在HDFS上过滤出,自己想要的文件或目录,HDFS系统的路径默认是支持正则过滤的,这一点非常强大,只要我们会写正则,我们几乎可以过滤任何我们想要的路径或文件。

详细内容请查阅这个链接http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#globStatus(org.apache.hadoop.fs.Path)
下面散仙就举个实际项目应用中的例子,这样能帮助大家更好的理解和使用它。
先看下面的一个HDFS上的存储结构图:





这是一个按日期每天生成的一个文件夹,当然这里可以有很多分维度的法,比如按照年,月,日,小时,来划分,具体情况应跟业务结合考虑。

看下,直接的根目录的下一级目录:




ok,存储结构清楚了,那么现在提几个需求

(1)只过滤出pv目录下的数据
(2)只过滤出uv目录下的数据
(3)只过滤出keyword目录下的数据
(4)只过滤出pv和uv的数据或者叫以v结尾的数据
(5)过滤2015年的数据
(6)过滤出某个时间范围内的数据比如2015-04-10到2015-04-17时间范围下的pv的数据


其实前个需求很简单都是一种需求:

hadoop里的FileStatus类是支持路径通配的,对应的写法如下:



	        FileSystem fs = FileSystem.get(conf);
	        //
	        //过滤pv或uv的目录数据
//	        String basepath="/user/d1/DataFileShare/Search/*/*/{pv,uv}";
	        //过滤v结尾的目录数据
//	        String basepath="/user/d1/DataFileShare/Search//*/*/*v";
	        //过滤uv的数据
//	        String basepath="/user/d1/DataFileShare/Search//*/*/uv";
	        //过滤pv的数据
//	        String basepath="/user/d1/DataFileShare/Search//*/*/pv";
	        
	        //过滤2015年的pv的数据
	        String basepath="/user/d1/DataFileShare/Search/2015*/*/pv";  
	        //获取globStatus
	        FileStatus[] status = fs.globStatus(new Path(basepath));
	        for(FileStatus f:status){
	        	//打印全路径,
	        	System.out.println(f.getPath().toString());
	        	//打印最后一级目录名
	        	//System.out.println(f.getPath().getName());
	        }





最后一个复杂,直接使用正则,会比较繁琐,而且假如有一些其他的逻辑在里面会比较难控制,比如说你拿到这个日期,会从redis里面再次匹配,是否存在,然后在做某些决定。

hadoop在globStatus的方法里,提供了一个路径重载,根据PathFilter类,通过正则再次过滤出我们需要的文件即可,使用此类,我们可以以更灵活的方式,操作,过滤路径,比如说上面的那个日期范围的判断,我们就可以根据全路径中,截取出日期,再做一些判断,并且可以再次过滤低级的路径,比如是pv,uv或keyword的路径。

实例代码如下:

调用代码:


 FileStatus[] status = fs.globStatus(new Path(basepath),new RegexExcludePathAndTimeFilter(rexp_date,rexp_business, "2015-04-04",  "2015-04-06"));


处理代码:
/**
	 * 实现PathFilter接口使用正则过滤
	 * 所需数据
	 * 加强版,按时间范围,路径过滤
	 * @author qindongliang
	 * 大数据交流群:(1号群) 376932160 (2号群) 415886155
	 * 
	 * **/
	static class RegexExcludePathAndTimeFilter implements PathFilter{
		 //日期的正则
		 private final  String regex;
		 //时间开始过滤
		 private final  String start;
		 //时间结束过滤
		 private final  String end;
		 //业务过滤
		 private final  String regex_business;
	 
		public RegexExcludePathAndTimeFilter(String regex,String regex_business,String start,String end) {
			this.regex=regex;
			this.start=start;
			this.end=end;
			this.regex_business=regex_business;
		}
		
		@Override
		public boolean accept(Path path) {
			String data[]=path.toString().split("/");
			String date=data[7];
			String business=data[9];
			return  Pattern.matches(regex_business, business)&&Pattern.matches(regex,date) && TimeTools.checkDate(start, end, date);
		}
		
		
		
	}
	
	/**日期比较的工具类**/
	static class TimeTools{
		
		final static String DATE_FORMAT="yyyy-MM-dd";
		
		final static SimpleDateFormat sdf=new SimpleDateFormat(DATE_FORMAT);
		
		public static boolean cnull(String checkString){
			if(checkString==null||checkString.equals("")){
				return false;
			}
			return true;
		}
		
		/**
		 * @param start 开始时间
		 * @param end 结束时间
		 * @param path 比较的日期路径
		 * **/
		public static boolean checkDate(String start,String end,String path){
			long startlong=0;
			long endlong=0;
			long pathlong=0;
			try{
			 if(cnull(start)){
				 startlong=sdf.parse(start).getTime();
			 }
			 if(cnull(end)){
				 endlong=sdf.parse(end).getTime();
			 }
			 if(cnull(path)){
				 pathlong=sdf.parse(path).getTime();
			 }
			//当end日期为空时,只取start+的日期
			if(end==null||end.equals("")){
				if(pathlong>=startlong){
					return true;
				}else{
					return false;
				}
			}else{//当end不为空时,取日期范围直接比较
				//过滤在规定的日期范围之内
				if(pathlong>=startlong&&pathlong<=endlong){
					return true;
				}else{
					return false;
				}
				
			}
			
			}catch(Exception e){
				log.error("路径日期转换异常: 开始日期:  "+start+"  结束日期 "+end+"  比较日期: "+path+"  异常: "+e);
			}
			
			return false;
		}




总结:

(1)如果只是简单的路径过滤,那么直接在路径中就使用正则通配是最简单强大的。

(2)如果是比较复杂的路径过滤,建议自定义PathFilter来封装过滤代码。

(3)如果是在建设初期的就把各个文件夹目录文件的存储规划好,这样是最好不过了,比如上面的pv是一个文件夹,然后下面是各个日期,uv是一个文件夹,然后下面是各种日期,这样从业务的角度就按维度切分好,那么我们处理起来也是非常方便的,这也就是Hive里面对应的分区功能,有了分区,我们就可以按需所取,尽量避免不必要的一些额外操作。


最后欢迎大家扫码关注微信公众号:我是攻城师,我们一起学习,进步和交流!(woshigcs)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访!






  • 大小: 238.5 KB
  • 大小: 305.8 KB
  • 大小: 124.6 KB
0
0
分享到:
评论

相关推荐

    8.Hadoop入门进阶课程_第8周_Hive介绍和安装部署.pdf

    根据提供的文件信息,以下是有关Hadoop入门进阶课程中Hive介绍和安装部署的知识点: 1. Hive介绍: - Hive是Facebook开发的数据仓库工具,运行于Hadoop集群之上。 - 提供类SQL的HQL(Hive Query Language)查询...

    大数据工作者--Hadoop进阶版hadoop创建

    在IT行业中,大数据处理是不可或...对Hadoop初级学者来说,理解这些概念和实践操作是迈进Hadoop高手之路的重要一步。通过搭建和配置HA集群,不仅能增强对Hadoop架构的理解,也为实际生产环境中的稳定运行打下坚实基础。

    hadoop2.x、Hive、HBase进阶加强视频

    这次分享的是hadoop2.x、Hive、HBase进阶加强视频,视频的质量我不保证,因为我还没有完全看过,如果老师讲的不好,请不要喷我,谢谢

    【大数据开发】Python大数据笔记讲义代码合集PDF

    03-笔记-Linux基础·Zookeeper·Hadoop·Hive.pdf 03-讲义-Linux基础·Zookeeper·Hadoop·Hive.pdf 04-笔记-项目新零售.pdf 06-代码-Spark.pdf 06-笔记-Spark.pdf 06-讲义-Spark-源ppt.pdf ...

    1.Hadoop入门进阶课程

    总的来说,“Hadoop入门进阶课程”是一个全面的学习路径,涵盖了从理论到实践的所有关键环节,帮助学员成为熟练的Hadoop开发者和大数据分析师。通过深入学习和实践,你可以掌握处理大规模数据的技能,为在大数据领域...

    Hadoop的学习路径

    Hadoop的学习路径

    2.Hadoop入门进阶课程_第2周_Hadoop2.X64位编译.pdf

    2.Hadoop入门进阶课程_第2周_Hadoop2.X64位编译.pdf 2.Hadoop入门进阶课程_第2周_Hadoop2.X64位编译.pdf

    hadoop/bin/hadoop.dll

    标题中的"hadoop/bin/hadoop.dll"指出这是一款与Hadoop框架相关的动态链接库(DLL)文件,它位于Hadoop安装目录的"bin"子目录下。在Windows操作系统中,DLL文件是程序运行所必需的组件,它们包含了可执行文件在运行...

    Hadoop的辉煌还能延续多久?

    相比之下,Hadoop的批量处理模式在数据量增长时,分析时间会相应增加,这在追求实时性的今天显得有些滞后。 此外,谷歌的Dremel系统在即时数据分析方面展现出强大的能力。Dremel能够在几秒钟内处理PB级别的数据,极...

    9.Hadoop入门进阶课程_第9周_Mahout介绍、安装与应用案例.pdf

    ### Hadoop入门进阶课程之Mahout介绍、安装与应用案例 #### Mahout概述 Mahout作为Apache Software Foundation(ASF)旗下的一个开源项目,致力于提供一系列可扩展的机器学习算法实现,以帮助开发者更轻松地构建...

    4.Hadoop入门进阶课程_第4周_HDFS原理及操作.pdf

    Hadoop是一个流行的开源框架,允许分布在商业硬件上的分布式存储和计算。Hadoop的核心部分是HDFS(Hadoop ...此外,通过Hadoop入门进阶课程的实践,可以更深入地理解和掌握HDFS的操作以及Hadoop整个生态系统的应用。

    Hadoop 权威指南第四版 配套代码

    Hadoop圣经 Hadoop权威指南第四版 最新配套代码 Hadoop权威指南第四版 最新配套代码

    7.Hadoop入门进阶课程_第7周_Pig介绍、安装与应用案例.pdf

    ### Hadoop入门进阶课程之Pig介绍、安装与应用案例 #### 一、课程概述 根据提供的文档信息,这是一门关于Hadoop生态系统的入门级课程中的第七周内容,主要介绍了Pig这一工具的基本概念、安装过程以及如何通过Pig...

    最短路径系列之一从零开始学习Hadoop

    Hadoop是一个由Apache基金会开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。它有以下几个核心组成部分: 1. Hadoop Common:包含...

    1.Hadoop入门进阶课程_第1周_Hadoop1.X伪分布式安装.pdf

    ### Hadoop 1.X 伪分布式安装知识点概览 #### 1. Hadoop 简介 - **定义**: Apache Hadoop 是一个开源框架,它允许开发者通过简单的编程模型来处理大量的数据集,并且能够在集群服务器上进行分布式处理。 - **特点**...

    Hadoop从业者为什么需要Spark?

    再说一点,Hadoop现在人才已经非常多了,想在该技术领域做到中国前100人之内是非常有难度的,而如果从事Spark则会更容易些,因为现在Spark人才不是稀少,而是太稀缺。 Hadoop从业者们,您需要Spark。

    6.Hadoop入门进阶课程_第6周_MapReduce应用案例.pdf

    Hadoop是一个分布式系统基础架构,由Apache基金会开发,它实现了MapReduce编程模型,用于大规模数据集的存储与计算。MapReduce是一种编程模型,用于处理和生成大数据集,它将任务分成两个阶段:Map阶段和Reduce阶段...

Global site tag (gtag.js) - Google Analytics