여러 파일 읽기
여러 파일 읽기 (Reading Multiple Files)
DuckDB는 glob 구문이나 읽을 파일 목록을 제공하는 방식으로 CSV, Parquet, JSON 등 서로 다른 타입의 여러 파일을 동시에 읽을 수 있어요. 오늘은 여러 파일을 읽는 다양한 방법을 함께 살펴볼까요?
출처: 문서
본문
DuckDB는 glob 구문을 사용하거나 읽을 파일 목록을 제공해서, 서로 다른 타입(CSV, Parquet, JSON 파일)의 여러 파일을 동시에 읽을 수 있어요. 서로 다른 스키마를 가진 파일을 읽는 팁은 [combining schemas]({% link docs/current/data/multiple_files/combining_schemas.md %}) 페이지를 참고하세요.
CSV
dir 폴더에서 이름이 .csv로 끝나는 모든 파일 읽기:
SELECT *
FROM 'dir/*.csv';
두 단계 깊이에서 이름이 .csv로 끝나는 모든 파일 읽기:
SELECT *
FROM '*/*/*.csv';
dir 폴더의 어떤 깊이에서든 이름이 .csv로 끝나는 모든 파일 읽기:
SELECT *
FROM 'dir/**/*.csv';
CSV 파일 flights1.csv와 flights2.csv 읽기:
SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv']);
CSV 파일 flights1.csv와 flights2.csv를 이름으로 스키마를 통합하고 filename 컬럼을 출력하며 읽기:
SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv'], union_by_name = true, filename = true);
Parquet
glob 패턴과 일치하는 모든 파일 읽기:
SELECT *
FROM 'test/*.parquet';
세 개의 Parquet 파일을 읽고 하나의 테이블로 취급:
SELECT *
FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);
두 특정 폴더의 모든 Parquet 파일 읽기:
SELECT *
FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);
어떤 깊이에서든 glob 패턴과 일치하는 모든 Parquet 파일 읽기:
SELECT *
FROM read_parquet('dir/**/*.parquet');
다중 파일 읽기와 Glob (Multi-File Reads and Globs)
DuckDB는 일련의 Parquet 파일을 읽어서 마치 하나의 테이블처럼 취급할 수도 있어요. 단, Parquet 파일들이 같은 스키마를 가질 때만 동작한다는 점을 주의하세요. 읽고 싶은 Parquet 파일을 목록 파라미터, glob 패턴 매칭 구문, 또는 둘의 조합으로 지정할 수 있어요.
목록 파라미터 (List Parameter)
read_parquet 함수는 입력 인자로 파일 이름 목록을 받을 수 있어요.
세 개의 Parquet 파일을 읽고 하나의 테이블로 취급:
SELECT *
FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);
Glob 구문 (Glob Syntax)
read_parquet 함수에 입력되는 어떤 파일 이름이든 정확한 파일명이거나, 패턴과 일치하는 여러 파일을 읽기 위한 glob 구문일 수 있어요.
| Wildcard | 설명 (Description) |
|---|---|
* |
어떤 문자든 (없는 경우 포함) 어떤 개수든 매치 |
** |
어떤 수의 하위 디렉토리든 (없는 경우 포함) 매치 |
? |
어떤 단일 문자든 매치 |
[abc] |
대괄호 안에 주어진 한 문자 매치 |
[a-z] |
대괄호 안에 주어진 범위에서 한 문자 매치 |
glob의 ? 와일드카드는 HTTP 인코딩 문제로 S3를 통한 읽기에서는 지원되지 않아요.
test 폴더에 있는 .parquet로 끝나는 모든 파일을 읽는 예시가 있어요:
모든 glob 패턴 일치 파일 읽기:
SELECT *
FROM read_parquet('test/*.parquet');
Glob 목록 (List of Globs)
glob 구문과 목록 입력 파라미터를 조합하면 여러 패턴 중 하나에 해당하는 파일을 스캔할 수 있어요.
2개의 특정 폴더에서 모든 Parquet 파일 읽기.
SELECT *
FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);
DuckDB는 glob 구문을 사용하거나 읽을 파일 목록을 제공해서 여러 CSV 파일을 동시에 읽을 수도 있어요.
파일명 (Filename)
filename 인자는 결과에 각 행이 어떤 파일에서 왔는지를 나타내는 추가 filename 컬럼을 추가하는 데 사용할 수 있어요. 예를 들어:
SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv'], union_by_name = true, filename = true);
| FlightDate | OriginCityName | DestCityName | UniqueCarrier | filename |
|---|---|---|---|---|
| 1988-01-01 | New York, NY | Los Angeles, CA | NULL | flights1.csv |
| 1988-01-02 | New York, NY | Los Angeles, CA | NULL | flights1.csv |
| 1988-01-03 | New York, NY | Los Angeles, CA | AA | flights2.csv |
filename인자는 문자열도 받아요 (예:filename = 'input_file'). 제공되면 그 문자열이 추가된 컬럼의 이름으로 사용돼요. 소스 데이터에 이미filename컬럼이 있어서 이름 충돌을 피하고 싶을 때 유용해요.
파일명을 찾는 Glob 함수 (Glob Function to Find Filenames)
glob 패턴 매칭 구문은 glob 테이블 함수를 사용해 파일명을 검색하는 데에도 쓸 수 있어요.
이 함수는 검색할 경로(glob 패턴을 포함할 수 있어요)라는 한 파라미터를 받아요.
현재 디렉토리의 모든 파일 검색.
SELECT *
FROM glob('*');
| file |
|---|
| test.csv |
| test.json |
| test.parquet |
| test2.csv |
| test2.parquet |
| todos.json |