如果 shell 脚本中的 运行 查询错误

query errors out if ran from shell script

我可以 运行 这个查询很好

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';"'

ERROR: AnalysisException: operands of type STRING and BOOLEAN are not comparable: upper(executing) = TRUE

我尝试过使用双引号、无引号和小写,但没有成功

单引号 不能 包含在 shell 中的 single-quoted 字符串中。 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';"