スキップしてコンテンツを表示

Athena クエリを実行できず、エラー "HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns" が発生する原因を教えてください。

所要時間2分
0

Amazon Athena クエリを実行できず、エラー "HIVE_INVALID_METADATA: Hive metadata for table sample_table is invalid: Table descriptor contains duplicate columns" が発生します。

簡単な説明

このエラーは、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. リスト内のテーブル名を選択し、[スキーマの編集] を選択します。
  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 の場合は、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"username" に設定した場合を除き、Athena は "Username" と ** を重複キーとして扱います。

Parquet のソースデータに重複キーがないか確認する

データソースが Parquet 形式で、テーブルに重複する列がある場合は、列名の 1 つを変更します。parquet.column.index.access SerDe プロパティは true に設定してください。Parquetは列に名前でアクセスし、ORCはインデックスでアクセスします。

詳細については、「スキーマ更新の処理」を参照してください。

関連情報

JSON SerDe ライブラリ

AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ