好程序员大数据学习路线分享UDF函数

好程序员大数据学习路线分享 UDF函数

1.为什么需要UDF?

1)、因为内部函数没法满足需求。

2)、hive它本身就是一个灵活框架,允许用自定义模块功能,如可以自定义UDF、serde、输入输出等。

2.UDF是什么?

UDF:user difine function,用户自定义函数,一对一。常用 udaf:user define aggregate function,用户自定义聚合函数,多对一。 udtf:user define table_generate function,用户自定义表生成函数,一对多。

3.怎么编写UDF函数??

1)、该类需要继承UDF,重写evaluate(),允许该方法重载。

2)、也可以继承 generic UDF,需要重写 initliaze() 、 getDisplay() 、 evaluate()

4.UDF的使用

第一种:(当前session有效)

package  edu.qianfeng.UDF;

import  org.apache.hadoop.hive.ql.exec.UDF;

/**
  *   使用Java 自定义UDF
  * @author lyd
  *
  *1603    1603 _class
  */
public   class  FirstUDF extends  UDF{
//重写evaluate()
public   String   evaluate ( String  str){
  //判断
  if (str == null ){
  return   null ;
  }
  return  str+ "_class" ;
}
}

1、添加自定UDF的jar包

hive>add jar /home/h2h.jar;

2、创建临时函数

hive>create temporary function myfunc as "edu.qianfeng.UDF.FirstUDF";

3、测试是否添加好:

show functions;
select myfunc("1603");

4、确定无用时可以删除:

drop temporary function myfunc;

第二种:( 当前 session 有效 )

package  edu.qianfeng.UDF;
import  org.apache.hadoop.hive.ql.exec.UDF;
import  org.json.JSONException;
import  org.json.JSONObject;

public   class  KeyToValue extends  UDF{
public   String   evaluate ( String  str, String  key){
  if (str == null  || key == null ){
  return   null ;
  }
  //sex=1&hight=180&weight=130&sal=28000
  //{sex:}
  String  str1 = str. replace ( "=" , ":" );
  String  str2 = str1. replace ( "&" , "," );
  String  str3 = "{" +str2+ "}" ;
  String  value = "" ;
  try  {
  JSONObject jo = new   JSONObject (str3);
  value = jo. get (key). toString ();
  } catch  (JSONException e) {
  e. printStackTrace ();
  }
  return  value;
}
public   static   void   main ( String [] args) {
  System . out . println ( new   KeyToValue (). evaluate ( "sex=1&hight=180&weight=130&sal=28000&facevalue=900" , "facevalue" ));
}
}

1、添加自定UDF的jar包(hive.aux.jars.path在该目录下的jar会在hive启动时自动加载)

<property>
     <name> hive.aux.jars.path </name>
     <value> $HIVE_HOME/auxlib </value>
</property>

cp /home/h2h.jar $HIVE_HOME/auxlib/

2、启动hive,创建临时函数

hive>create temporary function ktv as "edu.qianfeng.UDF.KeyToValue";

3、测试是否添加好:

show functions;
select myfunc("1603");

4、确定无用时可以删除:

drop temporary function myfunc;

第三种:( 当前 session 有效 )

1、创建一个初始化文件:

vi ./init-hive
add jar /home/h2h.jar;
create temporary function ktv1 as "edu.qianfeng.UDF.KeyToValue";

2、启动使用命令:

hive -i ./init-hive

3、测试是否添加好:

show functions;
select myfunc("1603");

4、确定无用时可以删除:

drop temporary function myfunc;

第四种:( 做成永久性 )

package  edu.qianfeng.UDF;
import  java.text.ParseException;
import  java.text.SimpleDateFormat;
import  java.util.Calendar;
import  java.util.Date;
import  org.apache.hadoop.hive.ql.exec.UDF;

/**
  *   根据出生年月获取周岁
  * @author lyd
  *  
  *   2000-04-19   17
  *   2000-04-20   16
  *   2000-04-21   16
  *
  */
public   class  BirthdayToAge extends  UDF{
     public   static   void   main ( String [] args) {
  System . out . println ( new   BirthdayToAge (). evaluate ( "2000-04-20" ));
}
public   String   evaluate ( String  birthday){
  if (birthday == null  || birthday. trim (). isEmpty ()){
  return   null ;
  }
  String  age = "" ;
  try  {
  //获取出生时间
  SimpleDateFormat  sdf = new   SimpleDateFormat ( "yyyy-MM-dd" );
  //获取出生的时间戳
  long  bithdayts = sdf. parse (birthday). getTime ();
  //获取今天的时间戳
  long  nowts = new   Date (). getTime ();
  //获取从出生到现在有多少秒
  long  alldays = (nowts - bithdayts)/ 1000 / 60 / 60 / 24 ;
  if (alldays < 0 ){
    return   null ;
  }
  //判断闰年
  int  birthdayyear = Integer . parseInt (birthday. split ( "-" )[ 0 ]);
  Calendar  ca = Calendar . getInstance ();
  int  nowyear = ca. get ( Calendar . YEAR );
  //循环找
  int  rnday = 0 ;
  for  ( int  i = birthdayyear; i < nowyear; i++) {
    if ((i% 400  == 0 ) || (i% 4  == 0  && i% 100  != 0 )){
    rnday ++ ;
    }
  }
  //将闰年的额天数减掉
  age = (alldays-rnday)/ 365 + "" ;
  } catch  ( ParseException  e) {
  return   null ;
  }
  return  age;
}
}

需要对源码编译。 1)将写好的Jave文件拷贝到~/install/hive-0.8.1/src/ql/src/java/org/apache/hadoop/hive/ql/UDF/

cd  ~/install/hive-0.8.1/src/ql/src/java/org/apache/hadoop/hive/ql/UDF/
ls -lhgt |head

2)修改~/install/hive-0.8.1/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java,增加import和RegisterUDF

import  com.meilishuo.hive.UDF.UDFIp2Long;     //添加import
registerUDF ( "ip2long" , UDFIp2Long. class , false ); //添加register

3)在~/install/hive-0.8.1/src下运行ant -Dhadoop.version=1.0.1 package

cd ~/install/hive-0.8.1/src
ant -Dhadoop.version=1.0.1 package

4)替换exec的jar包,新生成的包在/hive-0.8.1/src/build/ql目录下,替换链接

cp hive-exec-0.8.1.jar /hadoop/hive/lib/hive-exec-0.8.1.jar.0628
rm hive-exec-0.8.1.jar
ln -s hive-exec-0.8.1.jar.0628 hive-exec-0.8.1.jar

5)重启进行测试


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913892/viewspace-2654133/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69913892/viewspace-2654133/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值