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);

더 알아보기 (Learn more)