LabHub

DuckDB — 파일 위에서 바로 분석하는 열 지향 엔진 · 파일 위에서 바로 · 실습

파일 위에서 바로 질의한다

LabHub 에서 이어서 보기

목표

표를 만들지 않고 CSV 를 바로 질의하고, 추론이 틀린 열을 옵션으로 바로잡고,
Parquet 와 파티션으로 바꿔 크기·속도가 어떻게 달라지는지 직접 잽니다. 마지막에는
영속 DB 파일과 다시 돌릴 수 있는 보고서 스크립트를 남깁니다.

왜 중요한가

분석 요청의 절반은 "이 파일들 좀 봐 주세요" 로 시작합니다. 그때마다 표를 정의하고
적재하면 질문에 답하기 전에 하루가 갑니다. DuckDB 는 파일 경로를 FROM 에 적는
것으로 시작하고, 열 단위로 읽어서 집계가 빠르며, 서버가 없어서 설치할 것도
없습니다. 다만 스니퍼가 못 읽는 열은 조용히 문자열로 남으니 DESCRIBE 를 먼저
보는 습관이 이 실습의 핵심입니다. 그리고 CSV 는 받는 형식이지 보관하는 형식이
아닙니다 — Parquet 로 한 번 바꿔 두면 이후 모든 질의가 그 비용을 돌려받습니다.

환경

duckdb 를 치면 메모리 DB 로 열리고, duckdb /root/duck/sales.duckdb 처럼 경로를
주면 그 파일이 데이터베이스가 됩니다. 스크립트로 넘길 때는 duckdb <<'SQL' … SQL
또는 duckdb -c "질의" 를 씁니다. 자주 쓰는 점 명령: .timer on (실행 시간),
.mode csv (출력 형식), .quit.

결과를 파일로 쓰는 문법은 하나입니다.

COPY (select ...) TO '/root/duck/이름.csv' (FORMAT csv, HEADER);

픽스처는 /opt/lab/fixtures/duck/ 아래에 있습니다 (읽기 전용) — sales/2026-01…06.csv.gz
월별 판매 로그, messy/returns_2026q1.csv 지저분한 반품 파일, stores.csv,
fx_rates.csv. 산출물은 전부 /root/duck/ 아래에 둡니다 (mkdir -p /root/duck).

채점 전에 CLI 를 .quit 로 닫으세요. DB 파일을 쓰기로 열어 둔 채로는 채점기가
그 파일을 읽지 못합니다.

단계

1. sales/2026-01.csv.gz 를 표 없이 바로 질의해 행 수와 qty 합계 → /root/duck/01-jan.csv (rows, total_qty)
2. 반품 파일을 옵션 없이 DESCRIBE 한 결과 → /root/duck/02-describe.txt, 날짜·NULL 을 바로잡은 정제본 → /root/duck/02-returns.csv
3. 글롭으로 여섯 파일을 한 번에 읽어 파일별 행 수 → /root/duck/03-files.csv (file, rows)
4. 여섯 달치를 /root/duck/sales.parquet (zstd) 로 쓰고 크기·속도 비교 → /root/duck/04-compare.txt
5. Parquet 에서 매장별 집계 → /root/duck/05-by-store.csv, 메타데이터의 행 그룹 수·행 수 → /root/duck/05-meta.txt
6. month 로 파티션해 /root/duck/sales_by_month/ 에 쓰고, 3월만 읽은 집계 → /root/duck/06-march.csv
7. /root/duck/sales.duckdbsales · stores · fx_rates 표를 만든다
8. 상위 10개 상품을 뽑는 /root/duck/08-top-products.sql 을 쓰고 실행해 → /root/duck/08-top-products.csv

참고

단계 8개

  1. 표 없이 파일을 질의한다
  2. 추론이 틀린 열을 옵션으로 바로잡는다
  3. 글롭으로 여섯 파일을 한 번에
  4. Parquet 로 바꾸고 크기·속도를 잰다
  5. Parquet 를 다시 읽고 메타데이터를 본다
  6. 월별 파티션으로 쓰고 한 달만 읽는다
  7. 영속 DB 파일에 표를 남긴다
  8. 다시 돌릴 수 있는 보고서 스크립트