我有一个在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脚本,如果它确实错误我正在做什么。提前致谢
答案 0 :(得分:1)
hive -e
的每次调用都会产生一个新的进程,其中有一个新的hive shell,它没有前一个进程的记忆,因此hive&忘记了' UDF在哪...
一种解决方案是将它们链接在一个命令中,但将所有hive命令放在一个文件中(例如" commands.hql")并使用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 -e
和hive -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
也可以。