Hive—UDF函數編寫


一、UDF函數

UDF(User-Defined Functions)即用戶定義的hive函數。hive自帶的函數並不能完全滿足業務需求,這時就需要我們自定義函數。

二、分類

  1. UDF:one to one,進來一個出去一個,row mapping。是row級別操作,如:upper、substr函數
  2. UDAF:many to one,進來多個出去一個,row mapping。是row級別操作,如sum/min。
  3. UDTF:one to many ,進來一個出去多個。如alteral view與explode

三、編寫方法

1)程序編寫方法:

(1)繼承org.apache.hadoop.hive.ql.UDF

(2)需要實現evaluate函數;evaluate函數支持重載;

(3)在hive的命令行窗口創建函數

注:UDF必須要有返回類型,可以返回null,但是返回類型不能為void;

2)Hive加載jar文件

(1)添加jar

  add jar linux_jar_path

(2)創建function

  create [temporary] function [dbname.]function_name AS class_name;

 

(3)在hive的命令行窗口刪除函數

  Drop [temporary] function [if exists] [dbname.]function_name;

三、實例

1.eclipse建maven項目

2.導入依賴

  <dependencies>
      <dependency>
          <groupId>org.apache.hive</groupId>
          <artifactId>hive-exec</artifactId>
          <version>1.2.2</version>
      </dependency>
  </dependencies>

3.編寫一個測試函數

package com.atguigu.hive;

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

public class Lower extends UDF {

    public String evaluate(final String s) {
        if (s == null) {
            return null;
        }
        return s.toLowerCase();
    }
}

4.export導出jar文件

5.將udf.jar上傳至/opt/module/jars/目錄。

6.將jar包添加到hive的classpath

hive (default)> add jar /opt/module/jars/udf.jar;
Added [/opt/module/jars/udf.jar] to class path
Added resources: [/opt/module/jars/udf.jar]

7.創建臨時函數

hive (default)> create temporary function mylower as "com.atguigu.hive.Lower";
OK
Time taken: 1.06 seconds

temporary函數當前黑窗口有效,重新打開無效,提示以下錯誤。

hive (default)> select mylower(ename)  from emp;
FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'mylower'
View Code

8.執行臨時函數

hive (default)> select ename,mylower(ename) from emp;
OK
ename   _c1
SMITH   smith
ALLEN   allen
WARD    ward
JONES   jones
MARTIN  martin
BLAKE   blake
CLARK   clark
SCOTT   scott
KING    king
TURNER  turner
ADAMS   adams
JAMES   james
SMITH   smith
ALLEN   allen
WARD    ward
JONES   jones
MARTIN  martin
BLAKE   blake
CLARK   clark
SCOTT   scott
KING    king
TURNER  turner
ADAMS   adams
JAMES   james
Time taken: 1.07 seconds, Fetched: 24 row(s)

9.創建永久函數

(1)HDFS上創建路徑

[ck@hadoop102 ~]$ dfs -mkdir -p /lib

(2)上傳jar包到/lib路徑

hive (default)> dfs -put /opt/module/jars/udf.jar /lib

(3)創建函數

hive (default)> create function mylower1 as 'com.atguigu.hive.Lower' using jar 'hdfs://hadoop102:9000/lib/udf.jar';

(4)在MySQL的metastore庫中執行

select * from  FUNCS;

參考atguigu視頻資料


免責聲明!

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



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