Redshift에 관련하여 오랜만에 글을 작성하는거 같습니다. 최근 입사한 회사에서 Redshift를 사용하려고 하고 있어서 여러가지 테스트를 하는 와중에 오류를 발견하고 해결하는 과정에서 여러가지 삽질(?)을 경험하고 쉽게 해결하는 방법을 찾아서 공츄 차원에서 글을 작성 하였습니다.
🤔 무엇을 하려고 하였는가?
Redshift의 COPY를 이용하여 S3에 Parquet 형태로 저장된 데이터를 Redshift 테이블에 입력하고자 하였습니다. COPY의 경우 테이블을 만들면서 들어가는 경우는 지원하지 않는것 같고 이미 있는 테이블에 INSERT만 지원하는 것으로 보였습니다. 그래서 최초에 테이블을 만들어줘야 하는데요.
Glue 카탈로그를 이용하여 Athena에 있는 데이터의 DDL 생성을 통해서 CREATE TABLE 구문을 추출하여 Redshift의 데이터 타입에 맞게 수정하여 데이터를 INSERT 하려고 하였습니다.
위의 내용에서 error: Spectrum Scan Error code: 15007 라는 Keyword를 통해서 검색을 해봤습니다. 구글에 검색을 하였는데, 바로 공식문서가 나와서 확인 해봤습니다. 내용에 호환되지 않는 데이터 형식이라는 내용이 있어서 바로 봤습니다. ( 문서 바로가기 )
아래의 Query를 Redshift에서 실행해서 결과를 볼 수 있는 것 같았습니다. 그런데 결과가 딱히 나오지 않아서 조금 Query를 변경해서 다른 방법으로 검색 하였습니다.
select message
from svl_s3log
where query = pg_last_query_id()
order by query,segment,slice;
오류의 내용에 보면 pid값이 있습니다. 3213번 pid에 오류가 있다고 나오니 해당 테이블에서 pid를 검색해서 확인해봤습니다.
select *
from svl_s3log
where pid = 3213
order by query,segment,slice;
아래의 내용의 결과가 message 컬럼에 나타납니다.
Spectrum Scan Error. File ‘S3파일 위치’ has an incompatible Parquet schema for column ‘S3파일 위치.컬럼명’ Column type: DOUBLE, Parquet schema: optional fixed_len_byte_array 컬럼명 [i:4 d:1 r:0] (S3파일명)
위의 내용을 보면 Column type: DOUBLE, Parquet schema: optional fixed_len_byte_array 특정 컬럼이 DOBLE 로 해줘야 할거 같습니다. 저는 대충 FLOAT로 하면 될거라고 생각해서 다 FLOAT으로 줬는데... 범위를 넘어가는거 같습니다. 그래서 DOBLE로 변경 했더니 정상적으로 입력 됐습니다.