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"username" に設定した場合を除き、Athena は "Username" と ** を重複キーとして扱います。
Parquet のソースデータに重複キーがないか確認する
データソースが Parquet 形式で、テーブルに重複する列がある場合は、列名の 1 つを変更します。parquet.column.index.access SerDe プロパティは true に設定してください。Parquetは列に名前でアクセスし、ORCはインデックスでアクセスします。
詳細については、「スキーマ更新の処理」を参照してください。
関連情報
JSON SerDe ライブラリ