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

최종 업데이트 날짜: 2021년 5월 14일

Amazon Athena 테이블에서 쿼리를 실행하면 ‘HIVE_CURSOR_ERROR’ 예외가 발생합니다.

해결 방법

다음 조건 중 하나에서 이 예외가 발생할 수 있습니다.

  • 테이블 위치의 데이터 객체가 손상되었거나, 유효하지 않거나, 잘못 압축되었습니다.
  • 테이블 데이터 내의 레코드가 유효하지 않습니다(예: 잘못된 형식의 JSON 레코드).

일반적인 HIVE_CURSOR_ERROR 예외

기본 객체에 문제가 있는 경우 다음 HIVE_CURSOR_ERROR 예외 중 하나가 발생할 수 있습니다.

  • HIVE_CURSOR_ERROR: 잘못된 헤더 검사
  • HIVE_CURSOR_ERROR: 잘못된 블록 유형
  • HIVE_CURSOR_ERROR: 잘못된 데이터 검사
  • HIVE_CURSOR_ERROR: 예기치 않은 입력 스트림 끝
  • HIVE_CURSOR_ERROR: 저장된 블록 길이가 잘못됨
  • HIVE_CURSOR_ERROR: 잘못된 거리 코드

최근에 Amazon Simple Storage Service(Amazon S3) 테이블 위치에 새 객체를 추가한 경우 이러한 객체가 유효하고 손상되지 않았는지 확인합니다. 객체를 다운로드한 다음 적절한 도구를 사용하여 객체를 검사합니다. 예를 들어 GZIP 압축 객체의 압축을 풀면 압축이 유효한지 여부를 확인할 수 있습니다.

테이블이 분할된 경우 개별 분할 영역을 쿼리할 수 있는지 확인합니다. 테이블에 새 파티션이 있는 경우 유효하지 않은 객체가 포함될 수 있습니다.

특정 HIVE_CURSOR_ERROR 예외

HIVE_CURSOR_ERROR: 행이 유효한 JSON 객체가 아님

테이블 내의 행이 유효한 JSON 레코드가 아닌 경우 이 오류가 발생합니다.

이 문제를 해결하려면 다음을 수행합니다.

  1. 속성 'ignore.malformed.json' = 'true'를 추가하여 테이블을 다시 만듭니다.
  2. 다음과 유사한 명령을 실행하여 형식이 잘못된 레코드가 있는 파일을 식별하도록 새 테이블을 쿼리합니다.
SELECT "$path" FROM example_table WHERE example_column = NULL

자세한 내용은 Amazon Athena에서 JSON 오류 해결OpenX JSON Serde 옵션을 참조하세요.

HIVE_CURSOR_ERROR: 압축되지 않은 블록이 손상됨

테이블 위치의 객체가 LZO 형식을 사용하여 압축될 때 이 오류가 발생합니다.

LZO 압축 데이터에서 이 오류가 발생하지 않도록 하려면 INPUTFORMAT ‘com.hadoop.mapred.DeprecatedLzoTextInputFormat’을 사용하여 테이블을 다시 작성합니다. 예를 들면 다음과 같습니다.

CREATE EXTERNAL TABLE example_table (
    example_column_1 STRING,
    example_column_2 STRING
)
STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://example_bucket/example_prefix/'

다른 압축 형식을 사용하여 이 오류를 해결할 수도 있습니다.

HIVE_CURSOR_ERROR: 파일의 블록 0에 있는 0에서 값을 읽을 수 없음

S3 경로에 유효하지 않은 Parquet 객체가 있을 때 이 오류가 발생합니다. Parquet 객체에 DECIMAL 데이터 유형이 포함되어 있는지 확인합니다. Parquet 객체가 DECIMAL 데이터 유형을 포함하고 Spark를 사용하여 작성된 경우, Hive와 호환되지 않을 수 있습니다. 이 상태를 확인하려면 Spark 작업에서 Parquet 개체를 읽어 보세요.

Spark 작업을 사용하여 Parquet 객체를 읽을 수 있는 경우 다음 구성을 사용하여 Spark에서 레거시 모드로 Parquet 객체를 다시 작성합니다.

spark.sql.parquet.writeLegacyFormat = true

Parquet용 Spark 구성 옵션에 대한 자세한 내용은 Spark SQL 설명서의 구성을 참조하세요.

HIVE_CURSOR_ERROR: org.apache.hadoop.io.ArrayWritable은 org.apache.hadoop.io.Text로 캐스팅할 수 없음

테이블 정의 도중 잘못된 SerDe를 사용한 경우 이 오류가 발생합니다. 예를 들어 테이블에 JSON SerDe가 사용 중일 수 있으며 소스 데이터에는 Parquet 객체가 포함됩니다.

이 오류를 해결하려면 소스 데이터를 확인하고 올바른 SerDe가 사용되었는지 확인합니다. 자세한 내용은 지원되는 SerDes 및 데이터 형식을 참조하세요.