為什麼我的 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
名稱字串
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」視為重複的索引鍵。


相關資訊

JSON SerDe 程式庫

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