为什么我的 Athena 查询失败并显示错误 “HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns”?

2 分钟阅读
0

我的 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 控制台重命名重复的列:

  1. 打开 AWS Glue 控制台
  2. 在列表中选择表名,然后选择编辑架构
  3. 选择列名称,输入新名称,然后选择保存

检查是否有同名的表列和分区列

要检查分区列和表列名称是否重复,请在 AWS Glue 控制台中查看表架构。在以下示例中,分区列和表列均命名为 “id”。

示例数据:

{ "id" : 50, "name":"John" }{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }

表定义:

列名数据类型分区键
idint
namestring
idstringPartition (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 库

AWS 官方
AWS 官方已更新 8 个月前