Liam's Blog (AI & BigData)
阿新 • • 發佈:2019-01-02
1 編寫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>
最簡單的實現只需繼承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;
}
}
evaluate方法的輸入輸出即是UDF函式的輸入輸出.
Description註解部分提供函式的幫助資訊.
執行:desc function test.iptonum
輸出:
test.iptonum(ip) - Convert IPv4 to a num(long).
2 部署及建立UDF函式
PS:Hive0.13及以後版本適用
部署jar包
將jar包複製到HDFS.
hdfs -dfs -put udfs-0.1.jar 'hdfs:///user/hadoop/hiveUDF'
建立永久函式
需在Hive中執行sql語句,格式如下:
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
如:
create function test.iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'
函式需要屬於某個庫,如這裡是’test’,當其他庫呼叫時,需要加上庫名,如’test.iptonum’.
呼叫方式: select test.iptonum('127.0.0.1');
建立臨時函式
臨時函式只在當前session中有效,臨時函式不能指定庫.
create temporary function iptonum as 'com.liam8.hive.IpToNum' using jar 'hdfs:///user/hadoop/hiveUDF/udfs-0.1.jar'
呼叫方式: select iptonum('127.0.0.1');