Hive用户自定义函数
用户自定义函数
当Hive的内置函数不能满足需要时,可以通过编写用户自定义函数UDF(User-Defined Functions)插入自己的处理代码并在查询中使用它们。
按实现方式,UDF分如下分类:
- 普通的UDF,用于操作单个数据行,且产生一个数据行作为输出。
- 用户定义聚集函数UDAF(User-Defined Aggregating Functions),用于接受多个输入数据行,并产生一个输出数据行。
- 用户定义表生成函数UDTF(User-Defined Table-Generating Functions),用于操作单个输入行,产生多个输出行。
按使用方法,UDF有如下分类:
- 临时函数,只能在当前会话使用,重启会话后需要重新创建。
- 永久函数,可以在多个会话中使用,不需要每次创建。
下面以编写一个AddDoublesUDF为例,说明UDF的编写和使用方法:
功能介绍
AddDoublesUDF主要用来对两个及多个浮点数进行相加。在该样例中可以掌握如何编写和使用UDF。
说明:
- 一个普通UDF必须继承自“org.apache.hadoop.hive.ql.exec.UDF”。
- 一个普通UDF必须至少实现一个evaluate()方法,evaluate函数支持重载。
- 开发自定义函数需要在工程中添加hive-exec-1.3.0.jar依赖包,可从hive安装目录下获取。
样例代码
以下为UDF示例代码:
package com.huawei.bigdata.hive.example.udf; import org.apache.hadoop.hive.ql.exec.UDF; public class AddDoublesUDF extends UDF { public Double evaluate(Double... a) { Double total = 0.0; // 处理逻辑部分. for (int i = 0; i < a.length; i++) if (a[i] != null) total += a[i]; return total; } }
如何使用
- 把以上程序打包成AddDoublesUDF.jar,并上传到HDFS指定目录下(如“/user/hive_examples_jars/”)且创建函数的用户与使用函数的用户有该文件的可读权限。示例语句: hdfs dfs -put ./hive_examples_jars /user/hive_examples_jars hdfs dfs -chmod 777 /user/hive_examples_jars
- 需要使用一个具有admin权限的用户登录beeline客户端,执行如下命令: kinit Hive业务用户 beeline set role admin;
- 在Hive Server中定义该函数,以下语句用于创建永久函数: CREATE FUNCTION addDoubles AS ‘com.bigdata.hive.example.udf.AddDoublesUDF’ using jar ‘hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar’; 其中addDoubles是该函数的别名,用于SELECT查询中使用。 以下语句用于创建临时函数: CREATE TEMPORARY FUNCTION addDoubles AS ‘com.bigdata.hive.example.udf.AddDoublesUDF’ using jar ‘hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar’;
- addDoubles是该函数的别名,用于SELECT查询中使用。
- 关键字TEMPORARY说明该函数只在当前这个Hive Server的会话过程中定义使用。
- 在Hive Server中使用该函数,执行SQL语句: SELECT addDoubles(1,2,3); 说明: 若重新连接客户端再使用函数出现[Error 10011]的错误,可执行reload function;命令后再使用该函数。
- 在Hive Server中删除该函数,执行SQL语句: DROP FUNCTION addDoubles;