Hive的SQL可以通過用戶定義的函數(UDF),用戶定義的聚合(UDAF)和用戶定義的表函數(UDTF)進行擴展。
當Hive提供的內置函數無法滿足你的業務處理需要時,此時就可以考慮使用用戶自定義函數(UDF)。
UDF、UDAF、UDTF的區別:
UDF(User-Defined-Function)一進一出
UDAF(User-Defined Aggregation Funcation)聚集函數,多進一出
UDTF(User-Defined Table-Generating Functions)一進多出,如lateral view explore()
用戶自定義函數(user defined function),針對單條記錄。編寫一個UDF,需要繼承UDF類,並實現evaluate()函數。在查詢執行過程中,查詢中對應的每個應用到這個函數的地方都會對這個類進行實例化。對於每行輸入都會調用到evaluate()函數。而evaluate()函數處理的值會返回給Hive。同時用戶是可以重載evaluate方法的。Hive會像Java的方法重載一樣,自動選擇匹配的方法.
一、應用案例
1)全角轉半角
2)身份證信息驗證
二、添加jar的三種方式
1)使用add jar jarpath/hive-udf.jar;方法加入
該方法的缺點是每次啓動Hive的時候都要從新加入,退出hive就會失效。
2)通過設置hive的配置文件hive-site.xml 加入
在配置文件中增加配置
<property>
<name>hive.aux.jars.path</name>
<value>file:///jarpath/hive-udf1.jar,file:///jarpath/hive-udf2.jar</value>
</property>
保存即可
該方法比第一種方法方便很多。不需要每次啓動Hive執行命令加入,只是配置稍微複雜一些
3)在${HIVE_HOME}下創建auxlib目錄,將UDF文件放到該目錄中,這樣hive在啓動時會將其中的jar文件加載到classpath中
這種方法,方便快捷,不需要重啓HVIE服務
三、 函數聲明:
//創建臨時函數
create temporary function toSingleByte as 'com.sjck.hive.udf.ToSingleByte';
//創建永久函數
create function toSingleByte as 'com.sjck.hive.udf.ToSingleByte';
create function verifiyCardNo as 'com.sjck.hive.udf.VerifiyCardNo';
刪除永久函數
drop function toSingleByte;
drop function verifiyCardNo;
個人是將hive的udf 放在 hdfs上
hadoop fs -mkdir/user/hive/udf
hadoop fs -put hive-udf.jar /user/hive/udf/
create function toSingleByte AS 'com.sjck.hive.udf.ToSingleByte' using jar 'hdfs://master01:8020/user/hive/udf/hive-udf.jar';
create function verifiyCardNo AS 'com.sjck.hive.udf.VerifiyCardNo'using jar 'hdfs://master01:8020/user/hive/udf/hive-udf.jar';