工作过程中遇到很多情况需要进行日期格式处理,通常用下面的方法来实现:
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; } } }
相关推荐
### Spark与Hive自定义函数兼容性问题解析 在大数据处理领域,Apache Spark 和 Apache Hive 都是非常重要的工具。Spark 是一种快速通用的大规模数据处理系统,而Hive 则是一种数据仓库工具,主要用于对存储在 ...
本文主要讲解了 Hive 中自定义 UDF 函数的编写方法,包括创建 UDF 类、实现自定义函数逻辑、编译和打包 UDF jar 包、上传至 Hive 服务器并注册自定义函数。 一、创建 UDF 类 为了实现自定义 UDF 函数,需要创建一...
而自定义用户定义函数(UDF)是 Hive 中的一个重要功能,允许用户根据自己的需求编写自定义函数,以便在 Hive 查询中使用。 如何在 Hive 中创建自定义 UDF 函数: 步骤一:编写 Java 程序 首先,您需要编写一个 ...
3. Hive自定义函数(UDF): - UDF定义:用户可以编写Java代码实现特定功能的函数,然后在Hive SQL中调用。 - UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF...
总结来说,通过自定义UDF,我们可以方便地在Hive中实现数据脱敏功能,以保护敏感信息。这个过程涉及到Java编程、Hive API的使用以及SQL查询的编写。在实际应用中,可能需要根据业务需求调整UDF的行为,例如改变保留...
1. **复制到源码目录**:将自定义UDF的Java文件复制到`{Hive_source}\ql\src\java\org\apache\hadoop\hive\ql\udf`目录。 2. **修改注册文件**:在`FunctionRegistry.java`文件中导入自定义UDF类,并使用`...
udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...
Hive自定义函数(User Defined Function,UDF)是用户编写并集成到Hive系统中的函数,用来处理Hive不内置支持的特定计算或转换任务。UDF接受单个输入参数并返回一个结果,非常适合进行简单的数据转换和计算。 2. *...
在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...
在Hive中,UDF(User Defined Function)是用户自定义函数,允许我们扩展Hive的功能以满足特定的业务需求。本示例主要讲解如何在Hive中实现按月份的加减操作,这在时间序列分析或周期性报告中非常常见。 标题"hive...
为了满足特定的业务需求,Hive提供了用户定义函数(UDF)的功能,允许用户自定义处理数据的逻辑。在这个“hive-udf”项目中,我们主要探讨的是如何利用Java编写UDF来实现两个地址间的距离计算以及省市区位置的解析。...
为了实现这样的功能,我们可以自定义UDF(User Defined Function),扩展Hive的功能。标题中的“hive时间按月份加减UDF”指的就是这样一种用户自定义的函数,它可以方便地帮助我们处理与月份增减相关的任务。 文章...
hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理
它不仅覆盖了Hive的内置操作符和函数,而且提供了创建和使用自定义UDF的深入指南,对于任何希望深入学习和使用Hive进行大数据处理和分析的开发者来说都是一个宝贵的资源。通过理解这些知识点,用户可以更加灵活地在...
文件`hive-third-functions-master`很可能包含了这样的自定义UDF实现,供用户在Hive查询中引用。 2. **特殊数组函数**: 在Hive中,数组类型是一种复杂的数据类型,允许存储一组有序的元素。特殊数组函数可以帮助...
* 功能:对一些敏感信息进行脱敏处理,替换方式可选择自定义替换,如'#','*'等,,如不指定脱敏符号,使用个随机字符替换 * 脱敏位置可自定义,不指定位置,会对数据进行全脱敏 * 例如身份证信息: ...
Hive UDF是指用户可以根据自己的业务需求,自定义Java类来实现特定的数据处理逻辑,并将其封装成函数的形式供Hive SQL使用。根据功能不同,Hive UDF主要分为三类:基本UDF、通用UDF (GenericUDF) 和表生成UDF (UDTF)...
- 步骤2:调用自定义UDF,使用正则表达式进行格式规范化。 - 步骤3:检查清洗后的手机号码,确保其符合预期的格式。 - 步骤4:如果需要,可进一步进行缺失值处理或异常值检测。 7. **实践应用**:手机号码清洗在...
《深入理解Hive执行与用户自定义函数(hive-exec-udf)》 在大数据处理领域,Apache Hive作为一款基于Hadoop的数据仓库工具,扮演着重要角色。它提供了类SQL的查询语言(HQL)来操作分布式存储的数据,极大地简化了大...
在这个名为“Hive_UDF.rar_hive_sqoop”的压缩包中,我们可能会找到关于如何集成和自定义 Hive 用户定义函数(UDF)以及利用 Sqoop 进行数据导入导出的详细资料。 首先,让我们深入理解 Hive UDF。Hive 支持多种...