首页 > 解决方案 > 无法从 sh 文件向 hql 传递参数

问题描述

我有一个 .sh 文件,我从中将值传递给 .hql,但它给了我错误

sm=1
XXXXX=""
while read -r line
do
   name="$line"
   XXXXX="hive$name(${XXXX[$sm]%?})"
   echo $XXXXX
   hive -hiveconf var1=$XXXXX -hiveconf var2=/user/cloudera/project -hiveconf var3=$name -f test1.hql
   sm=$((sm + 1))
done < "$filename"


CREATE EXTERNAL TABLE IF NOT EXISTS ${hiveconf:var1}
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
location ${hiveconf:var2/hiveconf:var3};

*请注意,$XXXXX 在读取文件和一些逻辑后正在创建一个带有模式的表名。当我回显它时,没有问题,但问题出现在 .hql 文件中。错误有点像下面:

at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

失败:ParseException line 2:4 无法识别列类型 WARN 中“ROW”“FORMAT”“DELIMITED”附近的输入:调用了方法类 org.apache.commons.logging.impl.SLF4JLogFactory#release()。警告:请参阅http://www.slf4j.org/codes.html#release以获得解释。

标签: shellhive

解决方案


上面的替代方法是使用 hivevar:

sm=1
XXXXX=""
while read -r line
do
   name="$line"
   XXXXX="hive$name(${XXXX[$sm]%?})"
   echo "${XXXXX}"
   hive -hivevar var1=${XXXXX} -hivevar var2="/user/cloudera/project" -hivevar var3=${name} -f test1.hql
   sm=$((sm + 1))
done < "$filename"


CREATE EXTERNAL TABLE IF NOT EXISTS ${var1}
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
location ${var2/var3};

这里还有一个链接,用于阅读 hiveconf 和 hivevar 之间的区别,以防好奇 bug 咬伤:)

-hivevar 和 -hiveconf 有什么区别?


推荐阅读