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."인 열이 두 개 있습니다.
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'
)
오류를 해결하려면 ](https://docs.aws.amazon.com/athena/latest/ug/create-table.html)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/id=12 파티션 구조를 갖는 **s3://doc-example-bucket/athenajsontesting/**을 가리킵니다. 테이블을 만든 후 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 형식이고 테이블에 중복된 열이 있는 경우 열 이름 중 하나를 변경하십시오. parquet.column.index.access SerDe 속성을 true로 설정합니다. Parquet은 이름을 기준으로 열에 액세스하고 인덱스별로 ORC에 액세스합니다.
자세한 내용을 보려면 스키마 업데이트 처리를 참조하십시오.
관련 정보
JSON SerDe 라이브러리