Redshift Spectrum에서 데이터 비호환성 오류를 해결하려면 어떻게 합니까?

5분 분량
0

Amazon Redshift Spectrum에서 외부 스키마, 객체 또는 파일 유형을 사용하려고합니다. 그러나 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 하나요?

해결 방법

호환되지 않는 데이터 유형 오류

Redshift Spectrum에서 호환되지 않는 데이터 유형 오류를 해결하려면 다음 단계를 수행합니다.

1.    SVL_S3LOG 시스템 뷰에서 전체 오류 메시지를 검색합니다.

select * from SVL_S3LOG where query = '<query_ID_of_the_Spectrum_query>';

호환되지 않는 Parquet 스키마의 불일치로 인해 다음과 같은 오류 메시지가 생성됩니다.

File 'https://s3bucket/location/file has an incompatible Parquet schema for column ‘s3://s3bucket/location.col1'. Column type: VARCHAR, Par...

2.    오류 설명을 보려면 [메시지(Message)] 열을 확인합니다. 오류 설명은 Redshift Spectrum과 외부 파일 간의 데이터 비호환성에 대해 설명합니다.

3.    외부 파일의 스키마를 확인한 다음 CREATE EXTERNAL TABLE 정의의 열 정의와 비교합니다.

4.    (선택 사항) Apache Parquet 파일의 열 정의가 외부 테이블과 다른 경우 외부 테이블의 열 정의를 수정합니다. 열 정의는 Apache Parquet 파일의 열 파일 유형과 일치해야 합니다.

5.    SVV_EXTERNAL_COLUMNS 뷰에 대해 다음 쿼리를 실행합니다.

select * from SVV_EXTERNAL_COLUMNS where schemaname = '<ext_schema_name>' and tablename = '<ext_table_name>';

이 쿼리는 CREATE EXTERNAL TABLE 정의에서 열의 데이터 유형을 확인합니다.

참고: Apache Parquet과 같은 열 파일 유형의 경우 열 유형이 데이터에 포함됩니다. CREATE EXTERNAL TABLE 정의의 열 유형은 데이터 파일의 열 유형과 일치해야 합니다. 일치하지 않는 열 정의로 인해 데이터 비호환성 오류가 발생합니다.

잘못된 유형 길이 오류

DECIMAL 데이터 유형의 열이 있는 Redshift Spectrum 테이블을 선택하면 다음 오류가 발생할 수 있습니다.

S3 Query Exception (Fetch). Task failed due to an internal error. File ‘https://s3.amazonaws.com/…/<file_name>’ has an incompatible Parquet schema for column ‘<column_name>’
column ‘<column_name>’ has an invalid type length

Redshift Spectrum에서 잘못된 유형 길이 오류를 해결하려면 외부 테이블 정의를 사용합니다. 테이블 정의는 외부 파일에 정의된 “정밀도” 및 “배율” 값과 일치해야 합니다. 예를 들면 다음과 같습니다.

create external table ext_schema.tablename (c1 int, c2 decimal (6,2)) stored as PARQUET location 's3://.../.../';

이 예에서는 “정밀도” 및 “배율” 값에 대해 업데이트된 값(c2 십진수 열)은 각각 6과 2로 설정됩니다. 따라서 C2 열에 나열된 CREATE EXTERNAL TABLE 정의 값은 Apache Parquet 파일에 정의된 값과 일치해야 합니다.

내부 오류

Amazon Athena 카탈로그에서 외부 스키마를 선택하는 경우 Redshift Spectrum에서 다음과 같은 오류가 나타날 수 있습니다.

Task failed due to an internal error. File 'https://s3...snappy.parquet  has an incompatible Parquet schema for column 's3://.../tbl.a'. Column type: BOOLEAN, Parquet schema:\noptional int32 b [i:26 d:1 r:0]

Redshift Spectrum에서 CREATE EXTERNAL TABLE 열 순서는 Parquet 파일 필드의 순서와 일치해야 합니다. Apache Parquet 파일의 경우 모든 파일은 외부 테이블 정의와 동일한 필드 순서를 가져야 합니다. 이 순서를 건너뛰거나 데이터 유형 열을 다시 정렬하면 내부 오류가 나타납니다.

참고: Amazon Athena 데이터 카탈로그를 Redshift Spectrum으로 가져올 수 있지만 Redshift Spectrum에서는 쿼리를 실행하지 못할 수 있습니다. Redshift Spectrum에서 열 이름은 Apache Parquet 파일 필드와 일치합니다. 한편, Amazon Athena는 열 이름을 사용하여 Apache Parquet 파일의 필드에 매핑합니다.

내부 오류를 해결하려면 SELECT 문에서 다음 열 이름을 지정합니다.

select col_1, col_2, col_3, .... col_n from athena_schema.tablename;

또한 AWS Identity and Access Management(IAM) 역할이 Amazon Athena에 대한 액세스를 허용해야 합니다. 자세한 내용은 Amazon Redshift Spectrum에 대한 IAM 정책을 참조하십시오.

잘못된 열 유형 오류

Redshift Spectrum을 사용하여 AWS Glue Data Catalog 테이블에서 VARCHAR 데이터 유형 열을 쿼리하면 다음 오류가 나타날 수 있습니다.

<column_name> - Invalid column type for column <column_name>. Type: varchar"

AWS Glue 및 Redshift Spectrum 모두 VARCHAR 데이터 유형을 지원합니다. 그러나 AWS Glue Catalog에서 정의한 VARCHAR 데이터 유형에는 크기 파라미터(예: VARCHAR (256))가 포함되지 않습니다. Redshift Spectrum이 크기 파라미터 없이 정의된 VARCHAR 열을 쿼리하면 잘못된 열 유형 오류가 발생합니다.

잘못된 열 유형 오류를 해결하려면 다음 단계를 수행하십시오.

1.    다음 AWS 명령줄 인터페이스(AWS CLI) 구문을 실행하여 AWS Glue 테이블 데이터를 검색하고 로컬 파일에 저장합니다.

aws glue get-table --region us-east-1 --database gluedb --name click_data_json > click-data-table.json

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하십시오.

2.    텍스트 편집기를 사용하여 click-data-table.json 파일을 열고 외부 {"Table": ...} 봉투를 제거합니다. 예를 들어 업데이트된 구성은 다음과 같이 읽어야 합니다.

{"Name": "my-table", ...}

3.    UpdateTable 작업에서 허용되지 않는 필드를 모두 제거합니다. 예를 들어, 다음 필드를 제거할 수 있습니다.
DatabaseName
Owner
CreateTime
UpdateTime
LastAccessTime
CreatedBy
IsRegisteredWithLakeFormation.

4.    원하는 크기 파라미터를 사용하여 STRING 열 유형을 “varchar”로 수정합니다. 예를 들면 다음과 같습니다.

"Type": "varchar(1000)"

5.    다음 명령 구문을 사용하여 AWS Glue 테이블을 업데이트합니다.

aws glue update-table --region us-east-1 --database gluedb --table-input "$(cat click-data-table.json)"

6.    AWS Glue에서 테이블 정의를 확인하고 데이터 유형이 수정되었는지 확인합니다.

7.    Amazon Redshift의 외부 스키마에 대한 AWS Glue 테이블을 쿼리합니다. 예를 들면 다음과 같습니다.

create external schema glue_schema from data catalog database ‘gluedb’ iam_role 'arn:aws:iam::111111111111:role/myRedshiftRole' region 'us-east-1';

8.    click_data_json에 대해 다음 쿼리를 실행합니다.

select * from glue_schema.click_data_json;

잘못된 범위 오류

Redshift Spectrum은 외부 테이블에 속하는 Amazon Simple Storage Service(S3)의 파일이 쿼리 중에 덮어쓰여지지 않을 것으로 예상합니다. 만약 덮어쓰기가 발생할 경우 다음과 유사한 오류가 발생할 수 있습니다.

Error: Spectrum Scan Error. Error: HTTP response error code: 416 Message: InvalidRange The requested range is not satisfiable

위와 같은 오류를 방지하려면 Redshift Spectrum을 사용하여 쿼리하는 동안 Amazon S3 파일을 덮어쓰지 않도록 해야 합니다.

잘못된 Parquet 버전 번호

Redshift Spectrum은 액세스하는 각 Apache Parquet 파일의 메타데이터를 검증합니다. 검증에 실패하면 다음과 비슷한 오류가 발생할 수 있습니다.

File 'https://s3.region.amazonaws.com/s3bucket/location/file has an invalid version number

다음과 같은 이유로 검증이 실패할 수 있습니다.

  • 쿼리 중에 Parquet 파일을 덮어썼습니다.
  • Parquet 파일이 손상되었습니다.

관련 정보

Amazon Redshift Spectrum의 쿼리 문제 해결

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