Databricks로 개발하다가 알게된 소소한 지식/경험을 공유합니다.
오늘은 Databricks SQL로 S3에 저장된 Parquet 파일을 테이블처럼 읽는 방법을 다룹니다.
1. 들어가며
업무 중, S3에 있는 Parquet 파일의 데이터를 쿼리로 빠르게 확인하고 싶은 상황이 생겼습니다. External Table로 등록해도 되지만, 스키마 정의나 테이블 생성을 해줘야 하는 번거로움이 있는데요. 이번 글에서는 더 간단하게 Databricks SQL로 S3에 있는 파일들을 테이블처럼 읽는 방법을 정리해보겠습니다.
2. 사용 방법
2.1. 단일 파일 읽기
아래처럼 파일 포맷과 경로만 지정해주면, Databricks SQL이 Parquet 파일 안에 있는 메타 데이터를 읽어서, "어떤 컬럼이 있고, 데이터 타입은 무엇인지"를 자동으로 추론합니다. 즉, 별도의 스키마 정의나 테이블을 만들지 않고도 파일을 테이블처럼 조회할 수 있습니다.
SELECT *
FROM parquet.`s3://my-bucket/data/2025/04/25/part-00001.parquet`;
2.2. 여러 파일 한 번에 읽기
여러 파일을 함께 보고 싶다면 와일드카드(*)를 사용할 수 있습니다. 매칭된 경로 내의 모든 파일이 자동으로 병합되어 읽히는데, 다만, 파일 개수가 많을수록 메타 데이터 스캔 시간이 길어질 수 있습니다.
SELECT *
FROM parquet.`s3://my-bucket/data/2025/04/*/part-*.parquet`;
2.3. 다른 포맷 파일 읽기
Parquet 뿐 아니라 CSV, JSON 같은 다른 포맷도 이 방식을 사용해서 읽을 수 있습니다. 문법은 거의 유사하고, parquet 자리에 읽고 싶은 포맷을 적어주면, Databricks SQL이 내부적으로 포맷별 리더(reader)를 인식해 자동으로 처리해줍니다.
SELECT *
FROM csv.`s3://my-bucket/data/part.csv`;
2.4. 옵션 설정해서 읽기
앞선 방법들은 스키마가 명확한 파일을 미리보기 할 때는 좋지만, CSV나 JSON처럼 파싱 옵션이 필요한 포맷에는 한계가 있습니다. 이럴 때는 Databricks SQL의 read_files() 함수를 사용하면 됩니다. spark.read.format(...).option(...).load(...)를 SQL 문법으로 표현한 버전이라고 할 수 있습니다.
SELECT *
FROM read_files(
's3://my-bucket/data/sample.csv',
format => 'csv',
header => true, -- 첫번째 행을 컬럼명으로 인식
mode => 'FAILFAST' -- 잘못된 레코드 있으면 즉시 예외 발생
);
3. 어떨 때 써야할까?
오늘 소개한 직접 쿼리 방식은 데이터를 빠르게 확인하거나 검증할 때 유용합니다. 다만, 해당 파일들을 주기적으로 조회하거나 대시보드에서 반복 사용하는 경우에는 External Table이나 Delta Table로 등록하는 것이 다음과 같은 이유에서 훨씬 효율적입니다.
- 성능 측면: External Table/Delta Table은 스키마 정보를 캐싱하고, 통계 기반 최적화를 수행해서 매번 전체 파일 스캔 x
- 비용 측면: 직접 쿼리 방식은 매번 Parquet 파일의 footer를 읽어 스키마를 추론해서 반복 쿼리 시 I/O 비용 누적. 테이블로 등록해두면 이런 오버헤드가 줄어듦
- 관리 측면: 테이블로 등록해두면, Unity Catalog를 통해 권한 관리, lineage 추적 등을 적용 가능
4. 나가며
오늘은 Databricks SQL을 활용해 S3에 있는 파일을 테이블처럼 바로 쿼리하는 방법을 살펴봤습니다. 다음 포스트에서는 Delta Table이란 무엇인지 다뤄보도록 하겠습니다.
