fi UDF

Hive自定义UDF日期加减运算
本文介绍了如何在Hive中创建并使用自定义UDF(User Defined Function),特别是日期加减运算的UDF_DATE类。内容包括UDF的基本要求,如继承UDF类和实现evaluate方法,以及在Hive中注册和使用UDF的步骤。同时展示了UDF_DATE的具体实现,用于根据输入日期、计算频率和位移值进行日期计算。

UDF写法要求:

·      1.UDF必须继承:org.apache.hadoop.hive.ql.exec.UDF

·      2.必须至少实现一个evaluate方法,支持重载

在hive中添加UDF的方法:

·      将UDF上传到HDFS

·      登录beeline客户端,执行set的语句:set role admin;

·      在hive中注册jar包:add jarhdfs://hacluster/user/hds/udf_jar/UDF_DATE.jar;注意需要写HDFS集群名称如:hdfs://hacluster

·      如果在udf中使用了第三方的Jar包,需要将该jar包一起上传到hdfs,需要进行add jar操作,需注意:被引用的jar包先进性addjar操作,即引用jar包有先后顺序

·      创建函数 :TEMPORARY  表示此函数只是当前session生效

       CREATE TEMPORARY FUNCTION udf_date AS'com.huawei.bigdata.hive.example.UDF_DATE';


UDF_demo:

packagecom.huawei.bigdata.hive.example;

importjava.text.SimpleDateFormat;

importjava.util.Calendar;

importjava.util.Date;

importorg.apache.hadoop.hive.ql.exec.UDF;

/**

 * 做日期的加减运算

 *

 *@authorAdministrator

 *input_date:输入的日期

 *flag1:计算的频度 Y代表年 M代表月 D代表天

 *values:日期前后移动的位数

 */

publicclassUDF_DATEextendsUDF {

     publicStringevaluate(String input_date, String flag1, String values) {

     

           // 判断输入的日期是否合法

           if(input_date.length()!= 10 && input_date.length() != 8) {

                System.out.println("input_dateis wrong ,pleas check again ");

                System.exit(1);

           }

           if(!flag1.toUpperCase().equals("Y")

                     &&!flag1.toUpperCase().equals("M")

                     &&!flag1.toUpperCase().equals("D")) {

                System.out.println("flag1is wrong ,pleas check again ");

                System.out.println("please input Y or M  or D");

                System.exit(1);

           }

           // 判断输入的天数运算的值是否为数字

           booleanflag11 =true;

           for(inti =values.length(); --i > 0;) {

                if(!Character.isDigit(values.charAt(i))){

                     flag11=false;

                }

           }

           if(flag11 !=true) {

                System.out.println("flag2is values ,pleas check again ");

                System.exit(1);

           }

           Calendarcal = Calendar.getInstance();

           // 时间标准化

           SimpleDateFormatdf1 =newSimpleDateFormat("yyyyMMdd");

           SimpleDateFormatdf2 =newSimpleDateFormat("yyyy-MM-dd");

           // 判断日期的位数

           Stringoutput_date =null;

           if(input_date.length()== 10) {

           try{

                Dateinitdate=df2.parse(input_date);

                System.out.println(df2.format(initdate));

                cal.setTime(initdate);

                if(flag1.toUpperCase().equals("Y")) {

                     cal.add(Calendar.YEAR, Integer.parseInt(values));

                     output_date= df2.format(cal.getTime());

                }elseif(flag1.toUpperCase().equals("M")) {

                     cal.add(Calendar.MONTH, Integer.parseInt(values));

                     output_date= df2.format(cal.getTime());

                }elseif(flag1.toUpperCase().equals("D")) {

                     cal.add(Calendar.DATE, Integer.parseInt(values));

                     output_date= df2.format(cal.getTime());

                }

           }catch(Exception e) {

                e.printStackTrace();

           }

           }else{

                try{

                     Dateinitdate=df1.parse(input_date);

                     System.out.println(df1.format(initdate));

                     cal.setTime(initdate);

                     if(flag1.toUpperCase().equals("Y")) {

                           cal.add(Calendar.YEAR, Integer.parseInt(values));

                           output_date= df1.format(cal.getTime());

                     }elseif(flag1.toUpperCase().equals("M")) {

                           cal.add(Calendar.MONTH, Integer.parseInt(values));

                           output_date= df1.format(cal.getTime());

                     }elseif(flag1.toUpperCase().equals("D")) {

                           cal.add(Calendar.DATE, Integer.parseInt(values));

                           output_date= df1.format(cal.getTime());

                     }

                }catch(Exception e) {

                     e.printStackTrace();

                }

           }

           returnoutput_date;

     }                        

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值