S3 Parquet를 DuckDB로 조회하기
분석용 데이터를 별도 DB로 옮기지 않고, S3에 Parquet로 쌓아 DuckDB로 직접 SQL 조회하는 방법을 정리합니다.
분석용 데이터는 운영 DB로 옮기지 않아도 됩니다. S3에 Parquet로 쌓아 두고, DuckDB로 그 파일을 직접 SQL 조회합니다.
별도 분석 DB나 무거운 ETL 없이 읽기 전용 분석이 됩니다.
Parquet와 DuckDB, 무엇을 하는 물건인가
Parquet는 열(컬럼) 단위로 저장하는 파일 형식이고, DuckDB는 파일을 직접 읽어 SQL을 돌리는 가벼운 분석용 DB입니다. 둘을 합치면 S3에 올려 둔 Parquet 파일을 옮기지 않고 그대로 조회할 수 있습니다.
행 단위 저장(CSV 등)이 서류를 통째로 묶어 두는 방식이라면, Parquet는 항목별 칸으로 나눠 정리해 둔 서류함입니다. "이름 칸만 보고 싶다"면 그 칸만 꺼내면 됩니다.
운영 DB에 분석 쿼리를 직접 돌리면
운영 DB에 분석 쿼리를 직접 돌리면 무거운 집계가 서비스 트래픽과 자원을 다툽니다. 그렇다고 본격 데이터 웨어하우스를 두기엔 무겁고 비쌉니다.
그 중간이 S3 Parquet + DuckDB입니다. 데이터는 S3에 값싸게 쌓아 두고, 분석할 때만 DuckDB가 필요한 부분을 읽습니다. 운영 DB는 건드리지 않고, 상시 떠 있는 분석 서버도 두지 않습니다.

S3 Parquet 직접 조회 (httpfs, CREATE SECRET)
DuckDB에 S3 접근 확장(httpfs)을 올리면, S3 경로를 테이블처럼 바로 조회할 수 있습니다.
INSTALL httpfs; LOAD httpfs;
-- 자격 증명은 SECRET 으로 등록합니다
CREATE OR REPLACE SECRET s3_analytics (
TYPE s3,
PROVIDER config,
KEY_ID '...',
SECRET '...',
REGION 'ap-northeast-2'
);
-- S3 의 Parquet 를 직접 조회
SELECT count(*)
FROM read_parquet('s3://my-bucket/events/2026-06-19/*.parquet');
EC2·EKS 처럼 인스턴스 역할이나 IRSA 로 권한이 붙어 있는 곳에서는 키를 적지 않습니다.
aws 확장을 올리고 PROVIDER credential_chain 을 쓰면 AWS SDK 가 알아서 자격을 찾습니다.
INSTALL aws; LOAD aws;
CREATE OR REPLACE SECRET s3_analytics (TYPE s3, PROVIDER credential_chain);
SET s3_region = '...' 로 설정하는 옛 방식도 아직 동작하지만, DuckDB 문서는 이쪽을
Legacy Authentication Scheme
으로 분류하고 secret 사용을 권합니다.
여러 파일은 글롭(*)으로 한 번에 읽습니다. 별도 적재(load) 단계가 없습니다.
Hive 파티셔닝으로 읽는 양 줄이기
날짜 같은 기준으로 폴더를 나눠 저장하면(파티셔닝) 빨라집니다. 쿼리 조건에 그 기준이 들어가면, DuckDB는 해당 폴더만 읽고 나머지는 건너뜁니다(파티션 프루닝).
-- dt=YYYY-MM-DD 로 폴더가 나뉘어 있으면
SELECT user_id, count(*)
FROM read_parquet('s3://my-bucket/events/*/*.parquet', hive_partitioning = true)
WHERE dt = '2026-06-19' -- 이 폴더만 읽음
GROUP BY user_id;
여기에 Parquet의 컬럼 저장 특성이 더해집니다. SELECT user_id만 하면 그 열만 읽고, 나머지 열은 디스크에서 읽지도 않습니다.
파티션으로 읽을 파일 수를 줄이고, 컬럼으로 파일 안에서 읽는 양을 줄입니다.
