我的 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 | |
名稱 | 字串 | |
id | 字串 | 分區 (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 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" 視為重複的索引鍵。
檢查 Parquet 來源資料是否有重複的索引鍵
如果資料來源為 Parquet 格式,且資料表具有重複的欄,請變更其中一個欄名稱。將 parquet.column.index.access SerDe 屬性設定為 true。Parquet 依名稱存取欄,而 ORC 依索引存取。
如需詳細資訊,請參閱處理綱要更新。
相關資訊
JSON SerDe 程式庫