我的 Amazon Athena 查询失败,错误内容是 “HIVE_INVALID_METADATA: Hive metadata for table sample_table is invalid: Table descriptor contains duplicate columns”.
概述
当 AWS Glue 表架构包含重复的列名或与分区列同名的列时,就会发生此错误。
解决方案
检查列名是否重复
要识别重复列,请运行 SHOW CREATE TABLE 来检索表架构。或者,在 AWS Glue 控制台中查看表架构。在以下示例中,有两列都名为“column1”。
CREATE EXTERNAL TABLE `athenatestingduplicatecolumn_athenatesting`( `column1` bigint,
`column2` bigint,
`column3` bigint,
`column1` bigint)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://doc-example-bucket/athenatesting/'
TBLPROPERTIES (
'classification'='csv',
'skip.header.line.count'='1'
)
要解决该错误,请运行 CREATE TABLE,以唯一的列名重新创建 Athena 表。或者,使用 AWS Glue 控制台重命名重复的列:
- 打开 AWS Glue 控制台。
- 在列表中选择表名,然后选择编辑架构。
- 选择列名称,输入新名称,然后选择保存。
检查是否有同名的表列和分区列
要检查分区列和表列名称是否重复,请在 AWS Glue 控制台中查看表架构。在以下示例中,分区列和表列均命名为 “id”。
示例数据:
{ "id" : 50, "name":"John" }{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
表定义:
| | |
---|
列名 | 数据类型 | 分区键 |
id | int | |
name | string | |
id | string | Partition (0) |
使用以下任一选项来解决问题:
- 重命名 Amazon Simple Storage Service(Amazon S3)路径中的分区列。
- 重命名数据和 AWS Glue 表定义中的列名称。
- 如果源数据是 JSON,请使用映射函数而不是 AWS Glue 爬网程序来手动重新创建表。然后,在 Athena 中添加分区。在以下示例中,AWS Glue 表指向 s3://doc-example-bucket/athenajsontesting/,其分区结构如下:s3://doc-example-bucket/athenajsontesting/id=12。创建表后,使用 MSCK 修复表来加载分区。
CREATE EXTERNAL TABLE `athenajsontest_athenajsontesting2`( `id1` int COMMENT 'from deserializer',
`name` string COMMENT 'from deserializer')
PARTITIONED BY (
`id` string)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'mapping.id1'='id')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://doc-example-bucket/athenajsontesting'
TBLPROPERTIES (
'classification'='json',
'transient_lastDdlTime'='1578399113')
检查 JSON 源数据中是否有重复的键
如果 JSON 源数据包含的列名称仅大小写不同,例如 {“Username”:“bob1234”,“username”:“bob”},那么请参阅为什么我尝试在 Amazon Athena 中读取 JSON 数据时会出错?Athena 默认不区分大小写。Athena 将“Username”和“username”视为重复键,除非您使用 OpenX SerDE 并将区分大小写属性设置为False。
检查 Parquet 源数据中是否有重复的键
如果数据来源采用 Parquet 格式且表中有重复的列,则更改其中一个的列名。将 parquet.column.index.access SerDe 属性设置为 True。Parquet 按名称访问列,ORC则按索引访问。
有关更多信息,请参阅处理架构更新。
相关信息
JSON SerDe 库