Hive自定义UDF

Hive是一种构建在Hadoop上的数据仓库,Hive把SQL查询转换为一些列在Hadoop集群上运行的MapReduce作业,是MapReduce更高层次的抽象,不用编写具体的MapReduce方法。Hive将数据组织为表,这就使得HDFS上的数据有了结构,元数据即表的模式,都存储在名为metastore的数据库中。

Hive可以允许用户编写自己定义的函数UDF,在查询中使用。Hive中有3中UDF:

UDF:操作单个数据行,产生单个数据行。

UDAF:操作多个数据行,产生一个数据行。

UDTF:操作一个数据行,产生多个数据行。

 

用户构建UDF使用过程如下:

第一步:继承UDF,实现evaluate()方法,方法的参数和返回类型自己定义。

第二步:将写好的类打包成jar文件,如myhive.jar。

第三步:进入到Hive终端,利用add jar path/myhive.jar将自定义的jar加入到Hive环境中。

第四步:为该类起一个别名,create temporary function toUpper as 'com.lixue.udf.UDFToUpper'。

第五步:在select语句中使用toUpper()方法。

 

示例:

 

[java]  view plain  copy
 
  1. /** 
  2.  * 自定义UDF将小写字母转换成大写字母 
  3.  * @author 廖*民 
  4.  * time : 2015年1月30日下午8:18:59 
  5.  * @version 
  6.  */  
  7. public class UDFToUpper extends UDF {  
  8.   
  9.     /** 
  10.      * evaluate方法的返回类型和参数都是自定义的 
  11.      * 另外evaluate方法还支持重载。 
  12.      * @param s 
  13.      * @return 
  14.      */  
  15.     public Text evaluate(final Text s) {  
  16.   
  17.         if (null == s) {  
  18.   
  19.             return null;  
  20.         }  
  21.         //返回大写字母  
  22.         return new Text(s.toString().toUpperCase());  
  23.   
  24.     }  
  25.   
  26. }  


注:如上述代码是我们自定义的UDF,它实现的功能是将小写字母转换为大小字母,接下来是将这个类打成jar包,上传到服务器。

 

#添加到Hive环境:

 

[java]  view plain  copy
 
  1. hive (hive)> add jar /usr/local/src/udfToUpper.jar;  
  2. Added /usr/local/src/udfToUpper.jar to class path  
  3. Added resource: /usr/local/src/udfToUpper.jar  
  4. hive (hive)>   

 

 

#创建临时函数:

 

[java]  view plain  copy
 
  1. hive (hive)> create temporary function toUpper as 'com.lixue.udf.UDFToUpper';  
  2. OK  
  3. Time taken: 0.01 seconds  
  4. hive (hive)>   


#展示employees表中的数据。

 

 

[java]  view plain  copy
 
  1. hive (hive)> select * from employees;  
  2. OK  
  3. name    salary  subordinate deductions  address date_time   type  
  4. lavimer 15000.0 ["li","lu","wang"]  {"k1":1.0,"k2":2.0,"k3":3.0}    {"street":"dingnan","city":"ganzhou","num":101} 2015-01-24  love  
  5. liao    18000.0 ["liu","li","huang"]    {"k4":2.0,"k5":3.0,"k6":6.0}    {"street":"dingnan","city":"ganzhou","num":102} 2015-01-24  love  
  6. zhang   19000.0 ["xiao","wen","tian"]   {"k7":7.0,"k8":8.0,"k8":8.0}    {"street":"dingnan","city":"ganzhou","num":103} 2015-01-24  love  
  7. Time taken: 0.914 seconds  
  8. hive (hive)>   


#利用自定义的UDF在查询时将name改为大写:

 

 

[java]  view plain  copy
 
  1. hive (hive)> select * from employees;  
  2. //MapReduce...  
  3. OK  
  4. name    _c1  
  5. lavimer LAVIMER  
  6. liao    LIAO  
  7. zhang   ZHANG  
  8. Time taken: 4.674 seconds  
  9. hive (hive)>   


#删除临时函数:

 

 

[java]  view plain  copy
 
  1. hive (hive)> drop temporary function toUpper;  
  2. OK  
  3. Time taken: 0.017 seconds  
  4. hive (hive)> select toUpper(name) from employees;  
  5. FAILED: Error in semantic analysis: Line 1:7 Invalid function 'toUpper'  
  6. hive (hive)>   


注:UDF只能实现一进一出的操作,如果需要实现多进一出,则需要通过UDAF来实现。

 

 

更多UDF实例请参考:https://svn.apache.org/repos/asf/hive/tags/release-0.8.1/ql/src/java/org/apache/hadoop/hive/ql/udf/

你可能感兴趣的:(Hive自定义UDF)