Amazon Athena에서 테이블을 쿼리할 때 ‘GENERIC_INTERNAL_ERROR’ 오류를 해결하려면 어떻게 해야 합니까?

6분 분량
0

내 Amazon Athena 테이블을 쿼리하면 오류 ‘GENERIC_INTERNAL_ERROR’가 발생합니다.

간략한 설명

GENERIC_INTERNAL_ERROR 예외와 그 원인은 다음과 같습니다.

  • GENERIC_INTERNAL_ERROR: null: 다음 조건 중 하나에서 이 예외가 나타날 수 있습니다.
  • 테이블 정의에서 열의 데이터 유형 및 데이터 세트의 실제 데이터 유형 간에 스키마 불일치가 있습니다.
  • 잘못된 구문을 사용하여 CREATE TABLE AS SELECT (CTAS) 쿼리를 실행 중입니다.
  • GENERIC_INTERNAL_ERROR: parent builder is null: 데이터 유형 array 열과 SerDe 형식 OpenCSVSerDe를 사용하여 테이블을 쿼리할 때 이 예외가 나타날 수 있습니다. OpenCSVSerde 형식은 array 데이터 유형을 지원하지 않습니다.
  • GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT: 원본 데이터 열이 INT 데이터 유형으로 정의되고 숫자 값이 2,147,483,647보다 큰 경우 이 예외가 나타날 수 있습니다.
  • GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE: 원본 데이터 열의 숫자 값이 BYTE 데이터 유형에 허용되는 크기를 초과하는 경우 이 예외가 나타날 수 있습니다. 데이터 유형 BYTE는 TINYINT와 동일합니다. TINYINT는 2의 보수 형식인 8비트 부호 있는 INTEGER이며 최소 값이 -128이고 최대 값이 127입니다.
  • GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters: Amazon Simple Storage Service(Amazon S3) 데이터에 일관성이 없는 파티션이 있는 경우 이 예외가 나타날 수 있습니다. 다음 조건 중 하나에서 파티션이 일치하지 않을 수 있습니다.
  • Amazon S3의 파티션이 변경되었습니다(예: 새 파티션이 추가됨).
  • 테이블의 파티션 열 수가 파티션 메타데이터의 수와 일치하지 않습니다.
  • GENERIC_INTERNAL_ERROR: 동일한 키를 사용하는 여러 항목: 해당 내용이 다음과 같은 경우 JSON 데이터의 키(열)로 인해 이 예외가 나타날 수 있습니다.
  • 같은 이름이 두 번 사용됩니다.
  • 모두 소문자로 변환할 때도 동일한 이름을 사용합니다.

해결 방법

GENERIC_INTERNAL_ERROR:null

열 데이터 유형 불일치: 테이블 정의의 열 데이터 유형이 원본 데이터의 열 데이터 유형과 호환되는지 확인합니다. Athena는 schema-on-read 기술을 사용합니다. 즉, 쿼리가 처리될 때 테이블 정의가 Amazon S3의 데이터에 적용됩니다.

예를 들어, Parquet 파일에 테이블을 만든 경우:

  • Athena는 파일에서 스키마를 읽습니다
  • 그런 다음 Athena는 Parquet 파일이 쿼리되는 테이블 정의에 대해 스키마의 유효성을 검사합니다.

열의 기본 데이터 유형이 테이블 정의 도중 언급된 데이터 유형과 일치하지 않으면 열 데이터 유형 불일치 오류가 나타납니다.

이 문제를 해결하려면 원본 데이터 파일이 손상되지 않았는지 확인합니다. 원본 데이터 파일과 테이블 정의 간에 스키마 불일치가 있는 경우 다음 중 하나를 수행합니다.

  • AWS Glue 데이터 카탈로그를 사용하여 스키마를 업데이트합니다.
  • 업데이트된 테이블 정의를 사용하여 새 테이블을 작성합니다.

원본 데이터 파일이 손상된 경우 파일을 삭제한 다음 테이블을 쿼리합니다.

부정확한 구문: 다음 조건 모두에 해당하는 경우 ‘GENERIC INTERNAL ERROR:nul’ 오류가 발생할 수 있습니다.

이 오류를 방지하려면 CTAS 쿼리를 사용할 때 partitioned_bybucketed_by 속성에 서로 다른 열 이름을 사용해야 합니다. 이 오류를 해결하려면 partitioned_bybucketed_by 속성에 다른 열 이름을 선택하여 새 테이블을 작성합니다.

GENERIC_INTERNAL_ERROR: parent builder is null

이 오류를 해결하려면 데이터 유형 array가 있는 열을 찾은 다음 이 열의 데이터 유형을 string으로 변경합니다. 열 데이터 유형을 string으로 변경하려면 다음 중 하나를 수행합니다.

SHOW CREATE TABLE 명령을 실행하여 테이블을 작성한 쿼리를 생성합니다. 그런 다음 이 명령의 출력에서 모든 열의 열 데이터 유형을 봅니다. 데이터 유형 array가 있는 열을 찾은 다음 이 열의 데이터 유형을 string으로 변경합니다.

데이터 카탈로그로 테이블의 스키마를 업데이트하려면 다음을 수행합니다.

  1. AWS Glue 콘솔을 엽니다.
  2. 탐색 창에서 [테이블(Tables)]을 선택합니다.
  3. 업데이트할 테이블을 선택합니다.
  4. [작업(Action)]을 선택한 다음, [세부 정보 보기(View details)]를 선택합니다.
  5. [스키마 편집(Edit schema)]을 선택합니다.
  6. 데이터 유형 array가 있는 열로 스크롤한 다음 [array]를 선택합니다.
  7. [열 유형(Column type)]의 경우 드롭다운 목록에서 [string]을 선택합니다.
  8. [업데이트(Update)]를 선택합니다.
  9. [스키마 편집(Edit schema)] 페이지에서 [저장(Save)]을 선택합니다.

GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT

이 오류를 해결하려면 데이터 유형 int가 있는 열을 찾은 다음 이 열의 데이터 유형을 int에서 bigint로 업데이트합니다. 열 데이터 유형을 변경하려면 데이터 카탈로그에서 스키마를 업데이트하거나 업데이트된 스키마로 새 테이블을 작성합니다.

SHOW CREATE TABLE 명령을 실행하여 테이블을 작성한 쿼리를 생성합니다. 그런 다음 이 명령의 출력에서 모든 열의 열 데이터 유형을 봅니다. 데이터 유형 int가 있는 열을 찾은 다음 이 열의 데이터 유형을 bigint로 변경합니다.

데이터 카탈로그로 테이블의 스키마를 업데이트하려면 다음을 수행합니다.

  1. AWS Glue 콘솔을 엽니다.
  2. 탐색 창에서 [테이블(Tables)]을 선택합니다.
  3. 업데이트할 테이블을 선택합니다.
  4. [작업(Action)]을 선택한 다음, [세부 정보 보기(View details)]를 선택합니다.
  5. [스키마 편집(Edit schema)]을 선택합니다.
  6. 데이터 유형 int가 있는 열로 스크롤한 다음 [int]를 선택합니다.
  7. [열 유형(Column type)]의 경우 드롭다운 목록에서 [bigint]를 선택합니다.
  8. [업데이트(Update)]를 선택합니다.
  9. [스키마 편집(Edit schema)] 페이지에서 [저장(Save)]을 선택합니다.

GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE

이 오류를 해결하려면 데이터 유형 tinyint가 있는 열을 찾습니다. 그런 다음 이 열의 데이터를 유형을 smallint, int 또는 bigint로 변경합니다. 또는 업데이트된 스키마로 새 테이블을 작성하여 이 오류를 해결할 수 있습니다.

SHOW CREATE TABLE 명령을 실행하여 테이블을 작성한 쿼리를 생성합니다. 그런 다음, 이 명령의 출력에서 모든 열의 열 데이터 유형을 볼 수 있습니다. 데이터 유형 tinyint가 있는 열을 찾은 다음 이 열의 데이터 유형을 smallint, bigint 또는 int로 변경합니다.

데이터 카탈로그로 테이블의 스키마를 업데이트하려면 다음을 수행합니다.

  1. AWS Glue 콘솔을 엽니다.
  2. 탐색 창에서 **테이블(Tables)**을 선택합니다.
  3. 업데이트할 테이블을 선택합니다.
  4. [작업(Action)]을 선택한 다음, [세부 정보 보기(View details)]를 선택합니다.
  5. [스키마 편집(Edit schema)]을 선택합니다.
  6. 데이터 유형 tinyint가 있는 열로 스크롤한 다음 [tinyint]를 선택합니다.
  7. [열 유형(Column type)]의 경우 드롭다운 목록에서 [smallint], [bigint] 또는 [int]를 선택합니다.
  8. [업데이트(Update)]를 선택합니다.
  9. [스키마 편집(Edit schema)] 페이지에서 [저장(Save)]을 선택합니다.

GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters

이 오류를 해결하려면 다음 중 하나를 수행합니다.

ALTER TABLE doc_example_table DROP PARTITION (date = '2014-05-14');
    
ALTER TABLE doc_example_table ADD PARTITION (date = '2016-05-14', country = 'IN');

GENERIC_INTERNAL_ERROR: 동일한 키를 사용하는 여러 항목

행에 동일한 키를 가진 열이 여러 개 있는 경우 유효한 키-값 쌍을 포함하려면 데이터를 사전 처리해야 합니다. 일부 레코드에만 중복 키가 있는 경우 이러한 레코드를 무시하려면 ignore.malformed.jsonSERDEPROPERTIESorg.openx.data.jsonserde.JsonSerDe에서 설정합니다.

키 이름이 같지만 대/소문자가 다른 경우 (예: “Column”, “column”) 매핑을 사용해야 합니다. 이는 hive가 대소문자를 구분하는 열을 지원하지 않기 때문입니다. 이렇게 하려면 대소문자를 무시하도록 SerDe를 구성해야 합니다.

다음을 수행합니다.

CREATE TABLE mytable (  
  time1 string, 
  time2 string)
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
"case.insensitive" = "false", --tells hive to ignore key case
"mapping.time1"= "time", -- lowercase 'time' mapped into 'time1'
"mapping.time2"= "Time") -- uppercase to 'time2'

관련 정보

Amazon Athena의 데이터 유형

Athena에서 데이터 파티셔닝

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음