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