1. 程式人生 > >Hive UDF函式編寫流程詳解

Hive UDF函式編寫流程詳解

參考官網:
https://cwiki.apache.org/confluence/display/Hive/HivePlugins     新增hive UDF函式
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF   可檢視hive內建函式


常用命令:

SHOW FUNCTIONS;      檢視hive函式
DESCRIBE FUNCTION <function_name>;    檢視hive某個函式的用法
DESCRIBE FUNCTION EXTENDED <function_name>; 檢視hive某個函式更詳細的用法

UDF編寫步驟
一、使用IDEA建立maven工程,步驟:File-》New-》Project-》Maven-》maven-archetype-quickstart-》輸入maven座標完成maven工程建立
二、pom.xml中新增如下依賴
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <hadoop.version>2.6.0-cdh5.12.1</hadoop.version>
  <hive.version>1.1.0-cdh5.12.1</hive.version>
</properties>

<!--CDH版本需要新增repository,apache版本不需要-->
<repositories>
  <repository>
    <id>cloudera</id>
    <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
  </repository>
</repositories>


<dependencies>
  <!--新增Hadoop依賴-->
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>${hadoop.version}</version>
  </dependency>

  <!--新增Hive依賴-->
  <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>${hive.version}</version>
  </dependency>
</dependencies>三、編寫Hive UDF函式
新建一個類繼承UDF類並重寫evaluate方法,示列程式碼如下:

public class HelloUDF extends UDF{
    public Text evaluate(final Text s) {
        if (s == null) { return null; }
        return new Text("Hello:"+ s);
    }

    public static void  main(String[] args) {
        HelloUDF udf = new HelloUDF();
        Text result = udf.evaluate(new Text ("Hive"));
        System.out.println(result.toString());
    }
}


四、打包編譯生成jar包,註冊UDF函式
生成的jar包如:hive-1.0.jar
(1)臨時生效,即只在當前hive shell環境生效
hive> add jar hive-1.0.jar;     加入jar包,注意jar包的路徑,我這裡是當前路徑
Added [hive-1.0.jar] to class path
Added resources: [hive-1.0.jar]
hive> list jars;  檢視加入的jar包
hive-1.0.jar
hive> create temporary function hive_hello as 'com.mycompany.bda.UdfHello';   建立臨時函式
hive> show functions;   檢視函式,可知增加了函式hive_hello
hive> select hive_hello(fundaccount) from xx limit 3;  驗證:函式使用,藍色部分換成自己的表和表字段

(2)永久有效,可以在多hive shell回話視窗使用udf函式
把jar包上傳到hdfs,路徑如下:
[[email protected] ]# hadoop fs -ls hdfs://nameservice-ha/tzt/
-rw-r--r--   2 root root       2844 2018-01-18 10:03 hdfs://nameservice-ha/tzt/hive-1.0.jar
hive> CREATE FUNCTION addhello AS 'com.mycompany.bda.UdfHello' USING JAR 'hdfs://nameservice-ha/tzt/hive-1.0.jar';  藍色部分改成自己的路徑

函式驗證:
hive> select addhello('hive') from xx limit 3;     
hive> show functions;   可知多了一個函式default.addhello,default為當前使用的資料庫
另外也可以檢視hive元資料庫表select * from FUNCS;新增了一個函式addhello

五、Hive註冊UDF函式如何在Impala中使用
在impala-shell中重新整理一下元資料即可,使用命令
invalidate metadata; 
---------------------