雅典娜似乎在我的查询结果中包含了csv列标题。我使用下面的ddl重新创建了表 TBLPROPERTIES ("skip.header.line.count"="1")
删除标题。
我运行以下查询来验证 CREATE TABLE
ddl成功了。下面查询之间的唯一区别是在where子句中使用单引号和双引号。问题是我在运行它们时得到了不同的结果。
查询1:
SELECT
file_name
FROM table
WHERE file_name = "file_name"
上面的查询返回实际数据(请参阅下面的示例表),而不是仅返回file\u name字段为“file\u name”的行。
+-------+--------------------+
| Row # | file_name |
+-------+--------------------+
| 1 | |
| 2 | 1586786323.8194735 |
| 3 | |
| 4 | 1586858857.3117666 |
| 5 | 1586858857.3117666 |
| 6 | 1586858857.3117666 |
| ... | |
+-------+--------------------+
问题2:
SELECT
file_name
FROM table
WHERE file_name = 'file_name'
上面的查询返回 no results
,如果csv列标题未包含在结果中,则与预期一样。
我对第一个返回任何结果的查询感到非常困惑。在这一点上,我已经浏览了aws文档,似乎我没有做错ddl和sql,我不应该在意是否使用单引号和双引号。我错过了什么?
ddl地址:
CREATE EXTERNAL TABLE `table` (
`file_name` string,
`ticker` string,
...
)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'escapeChar'='\\',
'separatorChar'=',')
LOCATION
's3://{bucket_name}/{folder}/'
TBLPROPERTIES (
"skip.header.line.count"="1")
2条答案
按热度按时间xpcnnkqh1#
我只是想把戈登的回答再详细一点。您的第一个查询:
在本例中,双引号导致查询引擎处理
"file_name"
作为列标识符,而不是值,因此查询在功能上与:显然(以这种方式编写时)条件总是true,因此返回完整的表。
brccelvz2#
单引号是分隔字符串的sql标准。
双引号用于转义分隔符。所以呢
"file_name"
指该名称的列。有些数据库还接受字符串的双引号。那真是令人困惑。别那么做。例如,在原始标记中,hive使用backticks来转义标识符和字符串的双引号。presto使用双引号(这是标准)来分隔标识符。