Athena 쿼리가 ‘HIVE_INVALID_METADATA: Hive metadata for table is invalid: Table descriptor contains duplicate columns’ 오류와 함께 실패하는 이유는 무엇인가요?

3분 분량
0

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(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로 설정한 경우는 예외입니다.


관련 정보

JSON SerDe 라이브러리

AWS 공식
AWS 공식업데이트됨 2년 전