`

HIVE自定义处理时间格式的UDF

 
阅读更多

工作过程中遇到很多情况需要进行日期格式处理,通常用下面的方法来实现:

 

from_unixtime(to_unix_timestamp('20150813','yyyyMMdd'),'yyyy-MM-dd')

2015-08-13

 

如果再需要对日期进行一下加减多少天的话,还需要再增加长度:

 

date_sub(from_unixtime(to_unix_timestamp('20150813','yyyyMMdd'),'yyyy-MM-dd'),5)

2015-08-08

 

如果还需要把日期转换成整形的话,还需要再套个两层:

from_unixtime(to_unix_timestamp(date_sub(from_unixtime(to_unix_timestamp('20150813','yyyyMMdd'),'yyyy-MM-dd'),5),'yyyy-MM-dd'),'yyyyMMdd')

20150808

 

 

这样不仅使用不方便,而且代码的整洁度不好。

 

所以写了以下的UDF,先看效果:

 

myfunc('date_format','20150813','yyyyMMdd','yyyyMMdd-5d')

20150808

 

复杂点:

myfunc('date_format','2015-08-13 12:45:22','yyyy-MM-dd HH:mm:ss','yyyyMMddHHmmss-5d+3y-1s+1M')

20180908010244

 

UDF使用方法和说明:

hive> add jar /home/sospdm/Myfunc.jar;
Added /home/sospdm/Myfunc.jar to class path
Added resource: /home/sospdm/Myfunc.jar
hive> create temporary function myfunc as 'sospdm.udf.Myfunc';

 

udf可以支持多个参数传入,第一个参数为内置方法名称,通过不同的方法名可以执行不同的方法,方便后期扩展UDF功能,目前只支持一个'date_format',第二个参数是输入的日期,第三个是输入参数格式,第四个是输出日期的格式(可以做加减天数)。

 

代码如下:

 

package sospdm.udf;
    
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.exec.Description;

import java.util.Date;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.text.SimpleDateFormat;
    
    
    
    @Description(name = "myfunc",
    			value="_FUNC_(func_nm,parma1,parma2,[parma3],...)"+"",
    			extended = "Example:\n"
    					 + "> select _FUNC_('concat_low','aBc','dEf') from src;\n"
    					 + "Return:\n"
    					 + "abcdef;")
    
    
    public class Myfunc extends UDF{
    	

    	//***************************数据日期格式转换和加减计算****************************//
    	
		private static Date getDateAfter(Date dt,int[] num){  
			   Calendar now =Calendar.getInstance();  
			   now.setTime(dt);
			   now.add(Calendar.YEAR,num[0]);
			   now.add(Calendar.MONTH,num[1]);
			   now.add(Calendar.DAY_OF_MONTH,num[2]);
			   now.add(Calendar.HOUR_OF_DAY,num[3]);
			   now.add(Calendar.MINUTE,num[4]);
			   now.add(Calendar.SECOND,num[5]);
			   return now.getTime();
			   
			  }
		
		
		private static String getfmt(String str_input,String str_inputformat,String str_outputformat){
			
			try{
				

				//*********************通过正则表达式解析str_outputformat*********************
				SimpleDateFormat in_fmt = new SimpleDateFormat(str_inputformat);
				SimpleDateFormat out_fmt2 = new SimpleDateFormat(str_outputformat);
				//最长支持增加或者减少12位数的计算
				Pattern p = Pattern.compile("((\\+|-)\\d{1,12})([A-Za-z])");
				
				Matcher m = p.matcher(str_outputformat);
				Matcher m1 = p.matcher(str_outputformat);
				
				Date dt_input = in_fmt.parse(str_input);
				
				
				if(m1.find()){
					
					int pos_exg = m1.start();
					//*********************获取输入参数、输入参数格式参数格式*****************
					
					
					SimpleDateFormat out_fmt = new SimpleDateFormat(str_outputformat.substring(0,pos_exg));
					
					
					//新建HashMap类存储解析后的各个字符
					Map<String,Integer> map = new HashMap<String,Integer>();
					
					//初始化map
					map.put("y", 0);
					map.put("M", 0);
					map.put("d", 0);
					map.put("H", 0);
					map.put("m", 0);
					map.put("s", 0); 
					
					//第三个组作为KEY,第一组作为VALUE,更新map
					while(m.find()){
						map.put(m.group(3), Integer.valueOf(m.group(1)).intValue());
					}
					
					//数组初始化
					int[] num_arr = 
						{
							map.get("y"),
							map.get("M"),
							map.get("d"),
							map.get("H"),
							map.get("m"),
							map.get("s")
						};
					return out_fmt.format(getDateAfter(dt_input,num_arr));
				} else {
					
					return out_fmt2.format(dt_input);
				}
				
			}
			
			catch(Exception e){
				 
	    		e.printStackTrace();
	    		
			}
			return null;
		}
		
		
		
		
		//******************************UDF调用代码*************************************//
		
        public String evaluate(String func_nm,String... s){
        	try{

        		switch(func_nm){

                //日期格式转换
        		case "date_format":
        			return getfmt(s[0],s[1],s[2]);
        			
        		default:
        			return null;
        		}
        	} catch(Exception e){
        		e.printStackTrace();
        		return func_nm;
        	}
        }  
    	
    }  
    
    

 

 

1
2
分享到:
评论

相关推荐

    Spark不能使用hive自定义函数.doc

    ### Spark与Hive自定义函数兼容性问题解析 在大数据处理领域,Apache Spark 和 Apache Hive 都是非常重要的工具。Spark 是一种快速通用的大规模数据处理系统,而Hive 则是一种数据仓库工具,主要用于对存储在 ...

    hive自定义UDF编写函数.docx

    本文主要讲解了 Hive 中自定义 UDF 函数的编写方法,包括创建 UDF 类、实现自定义函数逻辑、编译和打包 UDF jar 包、上传至 Hive 服务器并注册自定义函数。 一、创建 UDF 类 为了实现自定义 UDF 函数,需要创建一...

    HIVE自定义UDF函数

    而自定义用户定义函数(UDF)是 Hive 中的一个重要功能,允许用户根据自己的需求编写自定义函数,以便在 Hive 查询中使用。 如何在 Hive 中创建自定义 UDF 函数: 步骤一:编写 Java 程序 首先,您需要编写一个 ...

    hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

    3. Hive自定义函数(UDF): - UDF定义:用户可以编写Java代码实现特定功能的函数,然后在Hive SQL中调用。 - UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF...

    Hive的Udf函数进行数据脱敏

    总结来说,通过自定义UDF,我们可以方便地在Hive中实现数据脱敏功能,以保护敏感信息。这个过程涉及到Java编程、Hive API的使用以及SQL查询的编写。在实际应用中,可能需要根据业务需求调整UDF的行为,例如改变保留...

    hive的自定义函数

    1. **复制到源码目录**:将自定义UDF的Java文件复制到`{Hive_source}\ql\src\java\org\apache\hadoop\hive\ql\udf`目录。 2. **修改注册文件**:在`FunctionRegistry.java`文件中导入自定义UDF类,并使用`...

    hive自定义udf函数实战

    udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...

    hive自定义函数demo

    Hive自定义函数(User Defined Function,UDF)是用户编写并集成到Hive系统中的函数,用来处理Hive不内置支持的特定计算或转换任务。UDF接受单个输入参数并返回一个结果,非常适合进行简单的数据转换和计算。 2. *...

    hive UDF需要jar包

    在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...

    hive按月份加减udf范例

    在Hive中,UDF(User Defined Function)是用户自定义函数,允许我们扩展Hive的功能以满足特定的业务需求。本示例主要讲解如何在Hive中实现按月份的加减操作,这在时间序列分析或周期性报告中非常常见。 标题"hive...

    hive-udf(两地址间距离计算+省市区位置解析(Java代码))

    为了满足特定的业务需求,Hive提供了用户定义函数(UDF)的功能,允许用户自定义处理数据的逻辑。在这个“hive-udf”项目中,我们主要探讨的是如何利用Java编写UDF来实现两个地址间的距离计算以及省市区位置的解析。...

    hive时间按月份加减UDF

    为了实现这样的功能,我们可以自定义UDF(User Defined Function),扩展Hive的功能。标题中的“hive时间按月份加减UDF”指的就是这样一种用户自定义的函数,它可以方便地帮助我们处理与月份增减相关的任务。 文章...

    hive-udf:hive自定义函数

    hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理

    HIve UDF 说明书

    它不仅覆盖了Hive的内置操作符和函数,而且提供了创建和使用自定义UDF的深入指南,对于任何希望深入学习和使用Hive进行大数据处理和分析的开发者来说都是一个宝贵的资源。通过理解这些知识点,用户可以更加灵活地在...

    一些有用的自定义配置单元udf函数、特殊数组、json、数学、字符串函数。___下载.zip

    文件`hive-third-functions-master`很可能包含了这样的自定义UDF实现,供用户在Hive查询中引用。 2. **特殊数组函数**: 在Hive中,数组类型是一种复杂的数据类型,允许存储一组有序的元素。特殊数组函数可以帮助...

    * hive脱敏UDF函数 *对一些敏感信息进行脱敏处理,替换位置可自定义,脱敏符号可随机也可自定义

    * 功能:对一些敏感信息进行脱敏处理,替换方式可选择自定义替换,如'#','*'等,,如不指定脱敏符号,使用个随机字符替换 * 脱敏位置可自定义,不指定位置,会对数据进行全脱敏 * 例如身份证信息: ...

    Hive UDF开发

    Hive UDF是指用户可以根据自己的业务需求,自定义Java类来实现特定的数据处理逻辑,并将其封装成函数的形式供Hive SQL使用。根据功能不同,Hive UDF主要分为三类:基本UDF、通用UDF (GenericUDF) 和表生成UDF (UDTF)...

    各种情况手机号清洗udf函数(hive impala)

    - 步骤2:调用自定义UDF,使用正则表达式进行格式规范化。 - 步骤3:检查清洗后的手机号码,确保其符合预期的格式。 - 步骤4:如果需要,可进一步进行缺失值处理或异常值检测。 7. **实践应用**:手机号码清洗在...

    hive-exec-udf

    《深入理解Hive执行与用户自定义函数(hive-exec-udf)》 在大数据处理领域,Apache Hive作为一款基于Hadoop的数据仓库工具,扮演着重要角色。它提供了类SQL的查询语言(HQL)来操作分布式存储的数据,极大地简化了大...

    Hive_UDF.rar_hive_sqoop

    在这个名为“Hive_UDF.rar_hive_sqoop”的压缩包中,我们可能会找到关于如何集成和自定义 Hive 用户定义函数(UDF)以及利用 Sqoop 进行数据导入导出的详细资料。 首先,让我们深入理解 Hive UDF。Hive 支持多种...

Global site tag (gtag.js) - Google Analytics