Athena 쿼리가 "HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns" 오류와 함께 실패합니다.
최종 업데이트 날짜: 2020년 12월 17일
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'
)
이 오류를 해결하려면 CREATE TABLE을 실행해서 고유한 열 이름이 있는 Athena 테이블을 다시 생성하세요. 또는 AWS Glue 콘솔에서 중복 열의 이름을 변경하세요.
- AWS Glue 콘솔을 엽니다.
- 목록에서 테이블 이름을 선택하고 [스키마 편집]을 선택합니다.
- 열 이름을 선택하고 새 이름을 입력한 다음, [저장]을 선택합니다.
같은 이름인 테이블 열과 파티션 열 검사
중복된 파티션 열과 테이블 열 이름이 있는지 검사하려면 AWS Glue 콘솔에서 테이블 스키마를 확인합니다. 다음 예시는 파티션 열과 테이블 열의 이름이 모두 "id"입니다.
샘플 데이터:
{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
테이블 정의:
열 이름 | 데이터 유형 | 파티션 키 |
id | 정수 | |
name | 문자열 | |
id | 문자열 | 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는 기본적으로 대소문자를 구분하지 않습니다. Athena는 "Username"과 "username"을 중복 키로 취급합니다. 단, OpenX SerDe를 사용해서 case.insensitive 속성을 false로 설정한 경우는 예외입니다.