为什么我的 Athena 查询失败,显示错误“HIVE_INVALID_METADATA:表的 Hive 元数据无效:表说明包含重复的列”?

2 分钟阅读
0

我的 Amazon Athena 查询失败,显示错误“HIVE_INVALID_METADATA:sample_table 表的 Hive 元数据无效:表说明包含重复的列”?

简短描述

如果 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,则在 Athena 中手动重新创建表并添加分区,并使用映射函数而不是 AWS Glue 爬网程序。在以下示例中,AWS Glue 表指向 s3://doc-example-bucket/athenajsontesting/,其分区结构如下:s3://doc-example-bucket/athenajsontesting/id=12。创建表后,请使用 MSCK REPAIR TABLE 加载分区。
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 默认不区分大小写。除非您使用 OpenX SerDe 并将 case.insensitive 属性设为 false,否则 Athena 会将“Username”和“username”视为重复键。


相关信息

JSON SerDe 库

AWS 官方
AWS 官方已更新 2 年前