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 コンソールを使用して重複する列の名前を変更します。
- AWS Glue コンソールを開きます。
- リスト内のテーブル名を選択し、[スキーマの編集] を選択します。
- 列名を選択して新しい名前を入力し、[保存] を選択します。
同じ名前のテーブル列とパーティション列をチェックする
パーティション列とテーブル列の名前が重複していないかどうかを確認するには、AWS Glue コンソールでテーブルスキーマを表示します。次の例では、パーティション列とテーブル列がどちらも「id」という名前になっています。
データ例:
{ "id" : 50, "name":"John" }{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
テーブル定義:
| | |
---|
列名 | データタイプ | パーティションキー |
id | int | |
name | string | |
id | string | Partition (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 ライブラリ