似乎Athena的查询结果中包含CSV列标题。我使用TBLPROPERTIES ("skip.header.line.count"="1")
删除了标头,使用下面的DDL重新创建了表。
我正在运行以下查询,以验证CREATE TABLE
DDL是否有效。以下查询之间的唯一区别是WHERE子句中使用单引号还是双引号。问题是运行它们时我得到不同的结果。
查询1:
SELECT
file_name
FROM table
WHERE file_name = "file_name"
上面的查询返回实际数据(请参见下面的示例表),而不是仅file_name字段为“ file_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")
单引号是用于分隔字符串的SQL标准。
双引号用于转义分隔符。因此,"file_name"
引用该名称的列。一些数据库还接受字符串的双引号。这只是令人困惑。不要那样做。