Semi-Structured Data
JSON 같은 스키마가 유연하고 중첩된 데이터를 효율적으로 저장·쿼리하는 패턴과 기술
핵심 개념
반정형 데이터(semi-structured data)는 완전히 정형화된 관계형 스키마와 비정형 텍스트의 중간 형태로, 필드가 동적으로 추가·변경되는 JSON, XML, BSON 같은 문서를 포함한다. 데이터 엔지니어링에서 이를 효율적으로 처리하는 것은 이벤트 스트림, IoT, API 응답 데이터 저장에 핵심 과제다.
전통적 저장 방식의 트레이드오프
| 방식 | 장점 | 단점 |
|---|---|---|
| JSON 문자열로 저장 | 스키마 유연성 | 쿼리 시 전체 파싱 필요, 느림 |
| 고정 스키마로 플래튼 | 빠른 컬럼 접근 | 스키마 진화에 취약, 빈 필드 낭비 |
| Parquet Variant | 두 방식의 장점 조합 | 새로운 기술, 생태계 성숙 진행 중 |
Apache Parquet Variant 타입
Parquet 2.x에서 도입된 Variant 논리 타입은 반정형 데이터를 위한 네이티브 고성능 솔루션이다.
핵심 설계
- 물리적 표현:
metadata(타입 정보·공유 딕셔너리) +value(이진 데이터) 두 필드 - 오프셋 기반 접근: 전체 문서 역직렬화 없이 특정 필드로 직접 탐색
- 타입 보존: 원본 데이터 타입을 네이티브 포맷으로 유지
- 필드명 중복 제거: 공유 딕셔너리로 스토리지 오버헤드 최소화
Shredding (선택적 최적화)
자주 접근하는 필드를 별도 타입 컬럼으로 추출하여 컬럼나 쿼리 최적화 활용:
- 예상 스키마에 맞는 필드 → 타입 컬럼에 저장
- 나머지 필드 → 이진 Variant 데이터로 유지 (타입 컬럼은 NULL)
생태계 지원
DuckDB, Apache Spark 4.0, Snowflake, Java/Rust/Go Parquet 라이브러리가 Variant 지원 통합
활용 패턴
이벤트 스트림 분석
서로 다른 이벤트 타입이 공존하는 스트림을 단일 테이블에 저장하면서 타입별 필드에 효율적으로 접근
IoT 센서 데이터
다양한 센서 타입의 데이터를 통합 저장하되, 공통 필드(timestamp, device_id)는 컬럼나로 shred하여 필터링 성능 확보
지오스페이셜 네이티브 타입 (Parquet)
Apache Parquet에 GEOMETRY/GEOGRAPHY가 1등 시민 논리 타입으로 추가:
- 바운딩 박스 통계를 청크/로우 그룹에 첨부하여 공간 쿼리 시 I/O 크게 절감
- WKB 물리 인코딩 + CRS 정보(EPSG 코드/PROJJSON)를 파일 메타데이터에 저장
- GeoParquet 1.0(사이드카) → 2.0(네이티브 타입)으로 진화
- DuckDB, Arrow C++, Rust, Iceberg 등에서 구현 진행 중
연관 개념
- Catalog-Managed Tables
- Query Optimization
- Real-Time Stream Processing
- Schema Evolution — 반정형 데이터의 스키마 진화 전략
Source: Apache Parquet - Variant Type for Semi-Structured Data, Apache Iceberg - Introducing the File Format API, Native Geospatial Types in Apache Parquet