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;
}
}