【问题标题】:query errors out if ran from shell script如果从 shell 脚本运行,则查询错误
【发布时间】: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
我尝试过使用双引号,没有引号和小写没有运气
【问题讨论】:
标签:
sql
bash
shell
impala
【解决方案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';"