AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

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に設定しない限り、Athena は「Username」と「username」を重複キーとして扱います。

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

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

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

関連情報

JSON SerDe ライブラリ

AWS公式
AWS公式更新しました 10ヶ月前
コメントはありません

関連するコンテンツ