无法从 sh 文件向 hql 传递参数

Posted

技术标签:

【中文标题】无法从 sh 文件向 hql 传递参数【英文标题】:Not able to pass parameters to hql from sh file 【发布时间】:2018-09-06 18:25:15 【问题描述】:

我有一个 .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 无法识别列类型中“ROW”“FORMAT”“DELIMITED”附近的输入 警告:调用了方法类 org.apache.commons.logging.impl.SLF4JLogFactory#release()。 警告:请参阅http://www.slf4j.org/codes.html#release 以获得解释。

【问题讨论】:

变量 XXXXX 包含“hivecategories(category_id int,category_department_id int,category_name string)”...但是当我在 hql 上回显它时,它没有传递整个值...只是“hivecategories( category_id ”,这导致了错误 【参考方案1】:

尝试引用变量:

hive -hiveconf var1="$XXXXX"

所有这些变量都应该被引用

在脚本中使用这个命令来检查传递的值:

! echo "$hiveconf:var1";

【讨论】:

【参考方案2】:

上面的替代方法是使用 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 之间的区别,以防好奇错误:)

What is the difference between -hivevar and -hiveconf?

【讨论】:

以上是关于无法从 sh 文件向 hql 传递参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从 gradle exec 任务传递到命令行

shell脚本从入门到复杂三(传递参数)

从 Python 向 SQLPlus 脚本传递参数

从 Shell 脚本向 Python 传递参数

创建函数-----------(向函数传递数组从函数返回数组)

怎样向shell函数中传递有空格的字符串参数