无法将参数从sh文件传递到hql

时间:2018-09-06 18:25:15

标签: shell hive

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

2 个答案:

答案 0 :(得分:1)

尝试引用变量:

hive -hiveconf var1="$XXXXX"

所有此类变量都应加引号

在脚本中使用此命令检查传递的值:

! echo "${hiveconf:var1}";

答案 1 :(得分:1)

上述方法的替代方法是使用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?