根据这篇文章similar post
,我的查询无效将以下命令与sql一起使用。但我不是从shell执行。 sql在python中创建为一个字符串,并使用paramiko传递给hive。在shell中它工作正常。但是当从python中传递为字符串时我得到了一个bash错误。它看起来像一些角色转义问题。
我试图加载csv文件,每个列值都用双引号括起来。
strsql='''create table temp(col1 INT,col2 string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("quoteChar" = "\"") tblproperties ('skip.header.line.count'='1'); '''
错误
["bash: -c: line 4: unexpected EOF while looking for matching `''\n", 'bash: -c: line 5: syntax error: unexpe cted end of file\n']
我改为("quoteChar" = "\\"")
以添加额外的斜杠。然后我得到一个SQL错误
:FAILED: ParseException line 4:38 cannot recognize input near 'quoteChar' '=' ')' i n table properties list
进一步检查时,调用hive命令时会显示一些提取属性,如下所示。这可能是个问题吗?
hive -e set hive.cli.print.header=true;hive.support.quoted.identifiers=column;hvesql;
答案 0 :(得分:0)
理想情况下,sql应该包含双引号。如下。正如Ronak在评论中提到的那样,双引号应该被转义。
ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.OpenCSVSerde"
WITH SERDEPROPERTIES ("quoteChar" = '"') tblproperties ("skip.header.line.count"="1")
因此,当从外部shell作为字符串变量发送时,它应该如下所示进行转义。需要使用双斜杠
ROW FORMAT SERDE \\"org.apache.hadoop.hive.serde2.OpenCSVSerde\\"
WITH SERDEPROPERTIES (\\"quoteChar\\" = '\\"') tblproperties (\\"skip.header.line.count\\"=\\"1\\")
有点简单。但是花了很多时间弄明白:)