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 콘솔에서 중복 열의 이름을 변경하세요.

  1. AWS Glue 콘솔을 엽니다.
  2. 목록에서 테이블 이름을 선택하고 [스키마 편집]을 선택합니다.
  3. 열 이름을 선택하고 새 이름을 입력한 다음, [저장]을 선택합니다.

같은 이름인 테이블 열과 파티션 열 검사

중복된 파티션 열과 테이블 열 이름이 있는지 검사하려면 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로 설정한 경우는 예외입니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?