首页 > 解决方案 > 即使在使用反引号(`)转义点后,在 Amazon Athena 中创建列名包含点(.)的表时也会出错

问题描述

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

特殊的角色

不支持下划线 (_) 以外的特殊字符。有关更多信息,请参阅 Apache Hive LanguageManual DDL 文档。

重要的

尽管您可以成功地创建包含除下划线以外的特殊字符的表、视图、数据库或列名称,方法是将它们括在反引号 (`) 字符中,但引用它们的后续 DDL 或 DML 查询可能会失败。

因此,我尝试使用存储在 S3 存储桶中的 JSON 文件创建一个表,并且 JSON 中的一个键包含多个点(。),根据链接上给出的信息,应该没问题我使用了反引号(`)逃避它。

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)

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

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

无论表是如何创建的,表创建过程都会将数据集注册到 Athena。此注册发生在 AWS Glue 数据目录中,并使 Athena 能够对数据运行查询。

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

也许我错过了一些东西。所以,如果有人在过去经历过这样的事情并解决了这个问题,请赐教。如果不可能做我想做的事,也请强调这一点,这样我就不会一直浪费我的时间。

标签: amazon-web-servicesamazon-s3amazon-athenaaws-glue-data-catalogaws-glue-spark

解决方案


您需要在整个事物周围使用反引号,而不仅仅是在特殊字符周围。以下应该工作

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 Crawler 在类似数据上运行良好,那么您可以查找它创建的架构SHOW CREATE TABLE


推荐阅读