CSV 파일 가져오기 팁
CSV 파일 가져오기 팁 (CSV Import Tips)
복잡한 CSV 파일을 가져올 때 유용한 팁들을 모아봤어요. 예시에서는 flights.csv 파일을 사용할게요.
출처: 공식문서
헤더 자동 감지가 틀리면 헤더 플래그를 직접 지정하세요
파일에 문자열(String) 컬럼만 있다면 헤더 자동 감지가 실패할 수 있어요. 이때는 header 옵션을 직접 지정해서 기본 동작을 덮어쓸 수 있어요.
SELECT * FROM read_csv('flights.csv', header = true);
파일에 헤더가 없다면 이름을 직접 제공하세요
파일에 헤더가 없으면 기본적으로 이름이 자동 생성돼요. 원하는 이름이 있다면 names 옵션으로 직접 지정할 수 있어요.
SELECT * FROM read_csv('flights.csv', names = ['DateOfFlight', 'CarrierName']);
특정 컬럼의 타입만 바꾸고 싶다면 types 옵션
types 플래그에 이름 → 타입 구조체(Struct)를 넘기면 일부 컬럼의 타입만 덮어쓸 수 있어요.
SELECT * FROM read_csv('flights.csv', types = {'FlightDate': 'DATE'});
데이터를 테이블로 바로 넣을 땐 COPY
COPY 문은 데이터를 테이블에 직접 복사해요. CSV 리더가 파일에서 타입을 자동 감지하는 대신 테이블의 스키마를 그대로 사용하기 때문에, 자동 감지가 빨라지고 자동 감지 과정에서 생길 수 있는 오류도 막아줘요.
COPY tbl FROM 'test.csv';
서로 다른 스키마의 파일을 합칠 때는 union_by_name
union_by_name 옵션을 쓰면 컬럼이 다르거나 일부 빠져 있는 파일들의 스키마를 하나로 통합할 수 있어요. 특정 컬럼이 없는 파일에는 NULL 값이 채워져요.
SELECT * FROM read_csv('flights*.csv', union_by_name = true);
테이블에 컬럼이 더 많다면 INSERT INTO ... BY NAME
이미 존재하는 테이블에 데이터를 넣는데, 테이블이 CSV 파일보다 컬럼이 더 많다면 INSERT INTO ... BY NAME 절을 사용할 수 있어요.
INSERT INTO tbl BY NAME
SELECT * FROM read_csv('input.csv');
샘플 크기 늘리기
CSV 스니퍼가 올바른 타입을 감지하지 못한다면 샘플 크기를 늘려보세요.
sample_size = -1 옵션은 스니퍼가 파일 전체를 읽도록 강제해요.
SELECT * FROM read_csv('my_csv_file.csv', sample_size = -1);