我的 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 控制台为重复的列重命名:
- 打开 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,则在 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 库