即使在使用反引号 (`) 转义点后,在 Amazon Athena 中使用包含点 (.) 的列名称创建 table 时出错

Error in creating table with column name containing dot (.) in Amazon Athena even after escaping the dot with backticks(`)

根据https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html,

Special characters

Special characters other than underscore (_) are not supported. For more information, see the Apache Hive LanguageManual DDL documentation.

Important

Although you may succeed in creating table, view, database, or column names that contain special characters other than underscore by enclosing them in backtick (`) characters, subsequent DDL or DML queries that reference them can fail.

因此,我尝试使用存储在 S3 存储桶中的 JSON 文件创建一个 table,JSON 中的一个键包含多个点 (.),根据link 上给出的信息应该没问题,我用反引号 (`) 来转义它。

CREATE EXTERNAL TABLE json_table (
id string,
version string,
com`.`org`.`dto`.`Customer string )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true')
LOCATION 's3://narendra-damodardas-modi-test-data/';

但出现以下错误:

line 1:8: no viable alternative at input 'create external' (service: amazonathena; status code: 400; error code: invalidrequestexception; request id: ef586f31-2515-4faa-a9fe-3a0e418235d2)

现在,您可能会说,根据提供的 link,很明显它不会起作用,但是当我通过 AWS Glue 中的 Crawler 执行此操作时,一切正常,我可以看到带点的列。

根据https://docs.aws.amazon.com/athena/latest/ug/understanding-tables-databases-and-the-data-catalog.html,

Regardless of how the tables are created, the tables creation process registers the dataset with Athena. This registration occurs in the AWS Glue Data Catalog and enables Athena to run queries on the data.

因此,AWS Athena 在幕后利用 AWS Glue,如果 Glue 的爬虫能够在 JSON 键中添加包含点 (.) 的列,那么为什么 Athena 的查询无法做到这一点。

也许我遗漏了什么。所以,如果有人在过去经历过这样的事情并解决了这个问题,请赐教。如果无法完成我想做的事情,也请强调这一点,这样我就不会一直浪费时间。

您需要在整个内容周围使用反引号,而不仅仅是在特殊字符周围。以下应该有效

CREATE EXTERNAL TABLE json_table (
  `id` string,
  `version` string,
  `com.org.dto.Customer` string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'ignore.malformed.json' = 'true'
)
LOCATION 's3://narendra-damodardas-modi-test-data/';

一般来说,我建议用反引号将所有列名括起来。

此外,如果您的 AWS Glue 爬虫在类似数据上运行良好,那么您可以查找它使用 SHOW CREATE TABLE

创建的架构