一、UDF相關概念
UDF,用戶自定義函數,可以直接在SQL語句中計算的函數:三個優點:
v1、允許實現模塊化的程序設計。方便修改代碼、增加函數
v2、UDF的執行速度很快,通過緩存計划在語句重復執行時降低代碼的編譯開銷。比存儲方法的執行效率更高。
v3、可用於減少網絡流量
UDF 存放在內存中, 設計不當將導致系統的崩潰, 所以必須在必要的時候實施優化。 對 UDF 的優化是通過手動改寫原來的 UDF 代碼實現的, 主要有以下兩種場景:
1) 如果 UDF 嵌套過於復雜, 可以重新寫一個嵌套層數較少的且可實現相同功能的 UDF, 使性能成倍提升。
2) 針對過濾類的 UDF, 將過濾率高的放在前面, 減少中間結果, 避免不必要的計算。
二、實例
1、導包
<properties> <hive-version>2.1.1</hive-version> <hadoop-version>2.7.2</hadoop-version> </properties> <artifactId>hive-UDF</artifactId> <dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive-version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop-version}</version> </dependency>
</dependencies>
2、創建類繼承UDF
創建方法public string evaluate(Text text)編寫代碼
public class MyUdfTest extends UDF { public String evaluate(Text text){ String result="格式不正確"; if(text!=null&&text.getLength()==11){ String str=text.toString(); result=str.substring(0,3)+"****"+ str.substring(7); } return result; } 說明:我這里對電話號碼中間四位進行遮掩,如果格式不為11位,則返回格式不正確
4、將代碼打包上傳到HDFS上
5、添加jar
add jar hdfs://nameservice1/yang/hive-UDF-1.0-SNAPSHOT.jar 注意:這里一定要寫絕對路徑,不然會報錯:找不到jar
6、創建一個臨時函數

create temporary function UDF_test as 'UDFTest'; show functions;可以查看自定義函數是否創建成功 創建永久函數 CREATE PERMANENT FUNCTION cao02_udtf AS 'com.wutest.udtf02' USING JAR 'hdfs://nameservice1/tmp/cao02.jar';
7、創建表並導入數據
--1、創建表 CREATE TABLE people(name STRING,phone STRING) CLUSTERED BY (name) INTO 7 BUCKETS STORED AS ORC tblproperties('transactional'='true'); --2、入數據 insert into people values('A','13550697449'); insert into people values('B','13355557985'); insert into people values('C','165862934666'); insert into people values('D','126489'); insert into people values('E','464823646253'); 導入數據1和2為正確格式,3,4,5,格式不正確
8、使用臨時函數進行測試

補充說明:
當一個project中存在多個UDF函數時,打包如下:






