上传jar包到HDFS上
hdfs dfs -put xxxx.jar /tmp/hive/
创建永久函数:
create function my_fun as 'com.test.TestUDF' using jar 'hdfs:///tmp/hive/xxxx.jar';
创建临时函数(只对当前窗口的命令行可用):
create temporary function my_fun as 'com.test.TestUDF' using jar 'hdfs:///tmp/hive/xxxx.jar';
报错:
由于自定义的UDF使用的xxxx.jar引入了第三方jar包。在使用UDF函数时会报错。
hive> select my_fun("1234567899","NUMBER");
Added [/tmp/0559eb39-c289-40dc-975f-7edf57c4843f_resources/xxxx.jar] to class path
Added resources: [hdfs:///tmp/hive/xxxx.jar]
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments '"NUMBER"':
org.apache.hadoop.hive.ql.metadata.HiveException:
Unable to execute method public java.lang.String com.test.TestUDF.evaluate(java.lang.String,java.lang.String)
with arguments {1234567899,NUMBER}:com/test/pdc/security/sdk/tass/enums/CryptoFieldType
解决:
方法一:(临时方案,只在当前窗口命令行生效)
将第三方jar包上传到HDFS
hdfs dfs -put dependencie.jar /tmp/hive/
hive命令行添加jar包:
hive> add jar hdfs:///user/hive/dependencie.jar;
方法二:
将UDF中使用的第三方jar包,放到本地的 hive/lib目录下。
在当前服务器使用hive ,可以正常使用自定义的UDF函数
方法三:
创建一个本地目录,把jar包都放进去。
mkdir /export/hive/dependencie_lib
修改hive-env.sh 增加配置
export HIVE_AUX_JARS_PATH=/export/hive/dependencie_lib
方法四:
创建一个本地目录,把jar包都放进去。
mkdir /export/hive/dependencie_lib
修改hive-site.xml 增加配置,多个jar包用,隔开。
< property>
< name> hive.aux.jars.path</ name>
< value> file:///export/hive/dependencie_lib/dependencie1.jar,file:///export/hive/dependencie_lib/dependencie2.jar</ value>
</ property>