Hive 用户自定义函数UDF
- 一、定义
- 二、解释
- 三、实例
- 3.1 导入相应的包
- 3.2 编写代码
- 3.3 打包
- 3.4 上传jar 、编译、打包成 jar 包并添加到 Hive 中
- 四、验证
一、定义
在Hive中,用户可以自定义一些函数用于扩展HiveQL的功能,这类函数叫作UDF (用 户自定义函数) 。
二、解释
Hive可以允许用户编写自己定义的函数UDF,来在查询中使用。Hive中有3种UDF:
UDF:操作单个数据行,产生单个数据行;
UDAF:操作多个数据行,产生一个数据行。
UDTF:操作一个数据行,产生多个数据行一个表作为输出。
org.apache.hadoop.hive.ql. exec.UDF, 基础的 UDF 函数读取和返 回基本类型,即 Hadoop 和 Hive 的基本类型, 如 Text、 IntWritable、 LongWritable、 DoubleWritable等。
org.apache.hadoop.hive.ql.udf.generic.GenericUDF, 复杂的 GenericUDF 可以处理 Map、 List、 Set 类型。
三、实例
3.1 导入相应的包
这里需要两个包:
hadoop-common.jar ---- 这个包应该在Hadoop 安装目录下面的, 我我这里是/opt/hadoop/share/hadoop/common/hadoop-common-3.1.2.jar
hive-exec-0.13.0.2.1.3.0-563.jar ,这个应该是在 hive /lib 目录下面
3.2 编写代码
新建了一个 项目,里面就一个Java文件,代码如下:
UUIDTest类要实现evaluate函数,获取随机字符串。
evaluate函数是可以有多个重载的。
@UDFType 这里有一个参数deterministic,是标识这个自定义函数是否是那种输入确定时输出就确定的函数,默认是true,比如length函数就是如果输入同一个值,那么输出肯定是一致的,
但是我们这里的UUID就算输入确定,但是输出也是不确定的,所以要将 deterministic设置为false。
@Describtion注解是可边的 ,用于对 函数进行说明,其中的一FUNC一字符串表示函数名 , 当使用 DESCRIBEFUNCTION命令时, 替换成函数名 。@Describtion包含三个属性:
name:用于指 定 Hive 中的函数名。
value:用于描述函 数的参数。
extended:额外的说明,例如当使用 DESCRIBE Fill叫CTION EXTENDED name 的时
候打印
package com;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.udf.UDFType;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
@org.apache.hadoop.hive.ql.exec.Description(name = "UUID",
extended = "示例:select UUID(32) from src;",
value = "-生成一个指定长度的随机字符串(最长为36位)")
@UDFType(deterministic = false)
public class UUIDTest extends UDF {
public Text evaluate(IntWritable leng) {
String uuid = java.util.UUID.randomUUID().toString();
int le = leng.get();
le = le > uuid.length() ? uuid.length() : le;
return new Text(uuid.substring(0, le));
}
/*
生成一个随机字符串
*/
public Text evaluate() {
String uuid = java.util.UUID.randomUUID().toString();
return new Text(uuid);
}
}
3.3 打包
这里 就不介绍了,有人用的 eclipse ,用人用的idea ,只要打成 jar 包就行了。
我这边 打成了对应的jar,生成了一个uuid.jar
3.4 上传jar 、编译、打包成 jar 包并添加到 Hive 中
先把jar 上传到 /usr/local/hive/lib/ 目录下面
hive
add jar /usr/local/hive/lib/uuid.jar;
create temporary function uuid as 'com.UUIDTest';
四、验证
执行对应的函数 ,如下:
select uuid() from load;