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');