hive UDF函數


一、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函數時,打包如下:

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM