如果从 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 脚本运行,则查询错误的主要内容,如果未能解决你的问题,请参考以下文章

在 impala-shell 中运行 Python 脚本

shell 往一个文件中添加内容

使用 Shell 脚本运行 SQL 查询并返回 CSV 格式的输出

impala-shell 查询失败并出现错误 (13)

检查查询是不是通过python成功运行

脚本查询网络接口的配置详情