Hive注册UDF的问题

先说推荐的注册方式,修改hive-site.xml添加以下类似配置:

<property>  
  <name>hive.aux.jars.path</name>
  <value>file:///home/stan/hive/auxlib/udf.jar</value>
</property>  

然后将自己的udf jar包放到和配置相对应的目录下,如果有多个jar包,配置中使用逗号隔开。

重启hive相关服务,就可以在hive的服务启动时自动加载jar包到classpath了。

然后通过以下命令注册UDF,以下注册方式均不需要执行add jar:

注册临时函数(每次开启新的会话都需要执行)

CREATE TEMPORARY FUNCTION test AS 'cn.zhaishidan.TestUDF'  

注册为永久函数(仅需执行一次,这个是hive 0.13以后才支持的)

CREATE FUNCTION test AS 'cn.zhaishidan.TestUDF'  

如果还用到了Spark,在Spark中还需要单独执行CREATE TEMPORARY FUNCTION test AS 'cn.zhaishidan.TestUDF'才能正常使用,目前Spark(1.4.1)加载永久注册的udf函数还有问题,不知道Spark以后是否会修复此问题。

遇到的那些坑

曾按照hive官方注册UDF的方式去注册UDF:

CREATE FUNCTION test AS 'cn.zhaishidan.TestUDF' USING JAR hdfs://192.168.1.101/udf.jar  

发现执行过程中报错:

Error: Error while compiling statement: FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments 'name': The UDF implementation class 'cn.zhaishidan.TestUDF' is not present in the class path (state=42000,code=10014)  

是因为Hive启动时并不能自动加载hdfs上的jar,必须要手动执行add jar将jar包加载到classpath才行。

网上还有人推荐将udf的jar包放到${HIVE_HOME}/auxlib目录下,hive服务启动时可以自动加载,不过经过测试无效,还是通过修改hive-site.xml才生效的(Hive版本0.13.1)。