hive udf通过shell脚本执行

时间:2016-05-13 11:31:36

标签: shell hive udf

我有一个在hive终端中运行良好的Hive Udf,我想要通过shell脚本执行它。 在配置单元终端上,我可以执行以下命令:

use mashery_db;
add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar;
add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb;
CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';

但是当我在shell脚本中添加上面的代码时

hive -e "use mashery_db;"
hive -e "add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar;"
hive -e "add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb;"
hive -e "CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';"

第一个'hive -e'运行良好并添加jar但最后一个创建临时功能不起作用。我收到以下错误:

FAILED: ParseException line 1:35 mismatched input 'com' expecting StringLiteral near 'AS' in create function statement

我也试过单引号

hive -e "CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';"

然后我得到FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask

FAILED: Class com.mashery.nextdata.hive.udf.GeoIPGenericUDF not found

hive Udf是否支持shell脚本,如果它确实错误我正在做什么。提前致谢

2 个答案:

答案 0 :(得分:1)

hive -e的每次调用都会产生一个新的进程,其中有一个新的hive shell,它没有前一个进程的记忆,因此hive&忘记了&#39; UDF在哪... 一种解决方案是将它们链接在一个命令中,但将所有hive命令放在一个文件中(例如&#34; commands.hql&#34;)并使用hive -f commands.hql <是一种更好的形式em>而不是-e的。

文件看起来像这样:

use mashery_db;
add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar;
add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb;
CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';"

答案 1 :(得分:0)

您可以将其与hive -ehive -f

一起使用
hive -e "use mashery_db;
add jar hdfs://nameservice1/tmp/nextdata_aggregations/custom_jar/readerCheck.jar;
add file hdfs://nameservice1/tmp/GeoLite2-City.mmdb;
CREATE TEMPORARY FUNCTION geoip AS 'com.mashery.nextdata.hive.udf.GeoIPGenericUDF';"

将它们创建为文件并使用hive -f hive_file.hql也可以。