Hive自定義UDF函數 Hive自定義UDF函數



Hive自定義UDF函數

以簡單的處理單個字段的UDF函數爲例,開發自定義UDF函數需要繼承’org.apache.hadoop.hive.ql.exec.UDF’類.
可以通過Maven添加,pom文件中加入(版本號跟Hive版本一致即可):

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>0.13.1</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

最簡單的實現只需繼承UDF類,並實現evaluate函數.如下UDF函數用來將IP(v4)地址轉換爲整數.

    package com.liam8.hive;

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

    /**
    * Convert IPv4 to a num which type is Long in java.
    * Created by Liam on 2016/4/11.
    */
    @Description(name = "IpToNum", value = "_FUNC_(ip) - Convert IPv4 to a num(long).")
    public class IpToNum extends UDF {

      public long evaluate(String ip) {
          String[] nums = ip.split("\\.");
          return Long.parseLong(nums[3]) + Long.parseLong(nums[2]) * 256
             + Long.parseLong(nums[1]) * 65536 + Long.parseLong(nums[0]) * 16777216;
      }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

evaluate方法的輸入輸出即是UDF函數的輸入輸出.
Description註解部分提供函數的幫助信息.
執行:desc function test.iptonum
輸出:
test.iptonum(ip) - Convert IPv4 to a num(long).

源碼已上傳 Github

2 部署及創建UDF函數

PS:Hive0.13及以後版本適用

部署jar包

將jar包複製到HDFS.

hdfs -dfs -put udfs-0.1.jar 'hdfs:///user/hadoop/hiveUDF'
  • 1
  • 2

創建永久函數

需在Hive中執行sql語句,格式如下:

CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
  • 1
  • 2
  • 3

如:

create function test.iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'
  • 1
  • 2

函數需要屬於某個庫,如這裏是’test’,當其他庫調用時,需要加上庫名,如’test.iptonum’.

調用方式: select test.iptonum('127.0.0.1');

**注:永久函數其實是在每次啓動hive時自動加載創建函數操作**

創建臨時函數

臨時函數只在當前session中有效,臨時函數不能指定庫.

create temporary function iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'
  • 1
  • 2

調用方式: select iptonum('127.0.0.1');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章