Athena クエリが「HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns」(HIVE_INVALID_METADATA: テーブルの Hive メタデータが無効です: テーブル記述子に重複する列が含まれています) というエラーで失敗するのはなぜですか?

所要時間2分
0

Amazon Athena クエリが「HIVE_INVALID_METADATA: Hive metadata for table sample_table is invalid: Table descriptor contains duplicate columns」(HIVE_INVALID_METADATA: sample_table テーブルの Hive メタデータが無効です: テーブル記述子に重複する列が含まれています) というエラーで失敗します。

簡単な説明

このエラーは、AWS Glue テーブルスキーマに重複する列名、またはパーティション列と同じ名前の列が含まれている場合に発生します。

解決方法

重複する列名の確認

重複する列を特定するには、SHOW CREATE TABLE を実行してテーブルスキーマを取得します。または、AWS Glue コンソールでテーブルスキーマを表示します。次の例では、「column1」という名前の列が 2 つあります。

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. リストからテーブル名を選択し、[Edit schema] (スキーマを編集) を選択します。
  3. 列名を選択し、新しい名前を入力して、[Save] (保存) を選択します。

同じ名前のテーブル列とパーティション列をチェックする

パーティション列とテーブル列の名前が重複しているかどうかを確認するには、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年前
コメントはありません

関連するコンテンツ