如果从shell脚本运行,则查询错误

时间:2018-03-16 15:50:55

标签: sql bash shell impala

我可以正常运行此查询

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 个答案:

答案 0 :(得分:2)

单引号不能包含在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';"