如果从 shell 脚本运行,则查询错误
Posted
技术标签:
【中文标题】如果从 shell 脚本运行,则查询错误【英文标题】:query errors out if ran from shell script 【发布时间】:2018-03-16 15:50:55 【问题描述】:我可以很好地运行这个查询
CREATE TABLE db.table1 STORED AS PARQUET as
SELECT * FROM db.table WHERE UPPER(executing) = 'TRUE';
除非我从 bash shell 脚本运行它。我收到此错误
#!/bin/bash
bash -c 'impala-shell -k -q "CREATE TABLE db.table1 STORED AS PARQUET as
SELECT * FROM db.table WHERE UPPER(executing) = 'TRUE';"'
错误:AnalysisException:STRING 和 BOOLEAN 类型的操作数不是 可比较:上(执行)= TRUE
我尝试过使用双引号,没有引号和小写没有运气
【问题讨论】:
您不能将单引号放在单引号字符串中。 【参考方案1】:单引号不能包含在 shell 中的单引号字符串中。 TRUE
周围的单引号不包含在传递给 impala-shell
的 SQL 命令中;第一个关闭最初的'
,第二个开始一个新的带引号的字符串,所以你的脚本相当于
bash -c "impala-shell -k -q \"CREATE TABLE db.table1 STORED AS PARQUET as
SELECT * from db.table WHERE UPPER(executing) = TRUE;\""
一种解决方案是像我上面所说的那样使用双引号,它允许您包含 SQL 所需的单引号。
bash -c "impala-shell -k -q \"CREATE TABLE db.table1 STORED AS PARQUET as
SELECT * from db.table WHERE UPPER(executing) = 'TRUE';\""
或者,使用$'...'
将参数引用到-c
,在这种情况下,您可以在字符串中包含正确转义的单引号。
bash -c $'impala-shell -k -q "CREATE TABLE db.table1 STORED AS PARQUET as
SELECT * from db.table WHERE UPPER(executing) = \'TRUE\';"'
但是不清楚你为什么使用bash -c
而不是直接运行impala-shell
:
impala-shell -k -q "CREATE ... WHERE UPPER(executing) = 'TRUE';"
【讨论】:
以上是关于如果从 shell 脚本运行,则查询错误的主要内容,如果未能解决你的问题,请参考以下文章