创建Hive用户自定义函数
当Hive的内置函数不能满足需要时,可以通过编写用户自定义函数UDF(User-Defined Functions)插入自己的处理代码并在查询中使用它们。
按实现方式,UDF分如下分类:
- 普通的UDF,用于操作单个数据行,且产生一个数据行作为输出。
- 用户定义聚集函数UDAF(User-Defined Aggregating Functions),用于接受多个输入数据行,并产生一个输出数据行。
- 用户定义表生成函数UDTF(User-Defined Table-Generating Functions),用于操作单个输入行,产生多个输出行。
按使用方法,UDF有如下分类:
- 临时函数,只能在当前会话使用,重启会话后需要重新创建。
- 永久函数,可以在多个会话中使用,不需要每次创建。
- 用户自定义函数需要用户控制函数中变量的内存、线程等资源的占用,如果控制不当可能会导致内存溢出、CPU使用高等问题。
- 若集群开启了Ranger鉴权,需要关闭Ranger鉴权后才能使用Python的UDF函数。
下面以编写一个AddDoublesUDF为例,说明UDF的编写和使用方法。
功能介绍
AddDoublesUDF主要用来对两个及多个浮点数进行相加,在该样例中可以掌握如何编写和使用UDF。
- 一个普通UDF必须继承自“org.apache.hadoop.hive.ql.exec.UDF”。
- 一个普通UDF必须至少实现一个evaluate()方法,evaluate函数支持重载。
- 开发自定义函数需要在工程中添加“hive-exec-*.jar”依赖包,可从Hive服务的安装目录下获取,例如在“${BIGDATA_HOME}/components/FusionInsight_HD_*/Hive/disaster/plugin/lib/”目录下获取。
样例代码
以下为UDF示例代码:
其中,xxx通常为程序开发的组织名称。
package com.xxx.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; } }
创建Hive用户自定义函数
- 准备执行函数的用户。
- 使用admin用户登录Manager界面,选择“集群 > 集群属性”,查看集群的“认证模式”并记录。
- 选择“集群 > 服务 > Hive”,单击页面右上角的“更多”查看Hive是否启用Ranger鉴权。
- 选择“系统 > 权限 > 用户”,单击“添加用户”,配置以下参数并单击“确定”,创建执行自定义函数的用户:
- 用户名:填写用户名称,例如:test。
- 用户类型:选择“人机”用户。
- “密码”和“确认新密码”输入该用户对应的密码。
- 用户组:单击“添加”,选择“hive”和“hadoop”用户组并单击“确定”。
- 根据集群的认证模式及是否启用Ranger鉴权为新创建的用户赋权:
- Hive使用Ranger鉴权,需使用Ranger管理员用户(安全模式集群为rangeradmin,普通模式集群为admin)登录Ranger管理界面为用户添加Hive权限控制策略。
- 选择“集群 > 服务 > Ranger”,单击“Ranger Web UI”右侧的超链接登录Ranger WebUI页面。
- 安全模式集群需单击页面右上角的用户名,在下拉框中单击“Log Out”退出当前用户,使用rangeradmin用户重新登录Ranger管理界面。
- 在首页中单击“HADOOP SQL”区域的组件插件名称如“Hive”。
- 在“Access”页签单击“Add New Policy”,配置以下参数并单击“Add”:
- Policy Name:设置策略名称,例如:test_hive。
- database:
- 永久函数:配置要添加函数的数据库名称,例如:default。
- 临时函数:将“database”切换为“global”,并配置具体的函数名或设置为*。
- table:切换为“udf”,并配置具体的函数名或设置为*。临时函数无需配置该参数。
- 在“Allow Conditions”区域的“Select User”列选择新增的用户,在“Permissions”新增以下权限:
- 永久函数:根据实际业务需求进行授权,例如,可新增“create”、“select”和“drop”权限。
- 临时函数:添加“Temporary UDF Admin”权限。
- Hive使用Manager角色鉴权,需创建具有Hive管理员权限的用户才能执行永久函数和临时函数。
- 在Manager页面首页,选择“系统 > 权限 > 角色”,单击“添加角色”,配置以下参数并单击“确定”:
- 角色名称:填写角色名称,例如:test_role。
- 配置资源权限:在“配置资源权限”列表中单击“待操作的集群名称 > Hive”,勾选“Hive管理员权限”。
- 单击“用户”,单击1.c新创建的用户所在行的“修改”。
- 在修改用户页面,单击“角色”右侧的添加,添加新创建的具有Hive管理员权限的角色,单击“确定”。
- 在Manager页面首页,选择“系统 > 权限 > 角色”,单击“添加角色”,配置以下参数并单击“确定”:
- 把以上程序打包成AddDoublesUDF.jar,并上传至客户端安装节点,例如“opt”目录下,再上传到HDFS指定目录下(例如“/user/hive_examples_jars”)。创建函数的用户与使用函数的用户都需要具有该文件的可读权限。
- 登录Hive客户端。
- 在Hive Server中执行以下命令定义该函数:
- 在Hive Server中执行以下命令使用该函数:
SELECT addDoubles(1,2,3);
若重新连接客户端再使用函数出现[Error 10011]的错误,可执行reload function;命令后再使用该函数。
- 在Hive Server中执行以下命令删除该函数:
DROP FUNCTION addDoubles;
扩展应用
无