Hive注册UDF的问题 2015-10-26 13:31:20 先说推荐的注册方式,修改hive-site.xml添加以下类似配置: ```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)。 非特殊说明,均为原创,原创文章,未经允许谢绝转载。 原始链接:Hive注册UDF的问题 赏 Prev 使用Ganglia监控Spark Next 程序设计之封装/信息隐藏(Information Hiding)