shell - 无法从 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以获得解释。
解决方案
上面的替代方法是使用 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 咬伤:)
推荐阅读
- css - 我需要将条排在底部,而不是顶部
- c++ - 一旦满足条件,c ++ while循环将不会退出
- html - 在 html textarea 标签中自动占用 4 个空格
- r - 如何训练具有多个不同长度向量的 SOM?(使用 R 包 kohonen 或其他)
- google-maps - 谷歌地图:NotLoadingAPIFromGoogleMapsError Angular
- flutter - flutter bloc package yeild 在状态管理中不起作用
- angular-material2 - OverlayContainer 与 FullscreenOverlayContainer
- angular - 如何在不刷新页面的情况下自动更新离子列表上的数据
- django - Django Rest Framework 断言错误:缺少 Meta.model 属性
- reactjs - 材质 UI 选择组件未选择输入值