목적과 학습 목표
JSON (JavaScript Object Notation) 파일을 수집하면서, 소스 시스템이 새 컬럼을 추가 했을 때 Auto Loader가 어떻게 자동으로 대응하는지를 실습합니다. 실제 프로덕션 환경에서 가장 빈번하게 발생하는 문제인 스키마 드리프트 (Schema Drift) 를 안전하게 처리하는 방법을 익힙니다.학습 목표
| 목표 | 설명 |
|---|---|
| JSON 수집 | JSON Lines 포맷의 파일을 Auto Loader로 수집합니다 |
| 스키마 추론 | inferColumnTypes로 중첩 구조를 포함한 타입을 자동 추론합니다 |
| 스키마 진화 | schemaEvolutionMode=addNewColumns로 새 컬럼이 자동으로 테이블에 추가되는 것을 확인합니다 |
| 기존 데이터 호환성 | 새 컬럼이 추가되어도 기존 레코드는 NULL로 채워져 손상 없이 유지됩니다 |
| Rescue Data | 스키마에 맞지 않는 데이터가 _rescued_data 컬럼에 보존되는 것을 확인합니다 |
스키마 드리프트(Schema Drift) 란?: 소스 시스템이 API 업데이트, 서비스 변경 등으로 기존 스키마에 새 필드를 추가하거나 타입을 바꾸는 현상입니다. 기존 파이프라인은 이를 인식하지 못해 에러가 발생하거나 새 데이터가 무시됩니다. Auto Loader의 스키마 진화 기능은 이 문제를 자동으로 처리합니다.
사전 준비
실습 1: 사전 준비와 CSV 수집 을 완료해야 합니다.- 카탈로그
training, 스키마auto_loader_lab, Volumeraw_data가 존재해야 합니다. - 다음 Python 임포트를 노트북 첫 셀에서 실행합니다:
실습 2A: JSON 파일 초기 수집
Step 1: JSON 샘플 데이터 생성
JSON Lines 포맷 (한 줄에 하나의 JSON 객체) 으로 고객 데이터를 생성합니다.Step 2: Auto Loader로 JSON 읽기
Step 3: Bronze 테이블에 저장
실습 2B: 스키마 진화 시뮬레이션
소스 시스템이 업그레이드되어 새 필드 2개 (phone, membership_level) 가 추가된 상황을 시뮬레이션합니다.
Step 1: v2 스키마 JSON 파일 생성
Step 2: 스키마 진화 트리거
동일한 스트리밍 쿼리를 다시 실행합니다. Auto Loader가 새 컬럼을 감지하고 스키마를 자동으로 확장합니다.내부 동작:schemaEvolutionMode=addNewColumns는 신규 파일에서 기존 스키마에 없는 컬럼을 발견하면,schemaLocation의 스키마 파일을 업데이트하고 스트림을 재시작합니다.mergeSchema=true는 Delta 테이블 자체의 스키마도 새 컬럼을 포함하도록 확장합니다.
Step 3: 스키마 진화 결과 확인
스키마 진화 결과:phone과membership_level컬럼이 테이블에 추가되었습니다. 이전 배치 (v1) 레코드는 해당 컬럼이NULL로 표시됩니다. 이것이 Backward Compatible Schema Evolution (하위 호환 스키마 진화) 입니다.
실습 2C: 중첩 JSON 구조 처리
실제 API 응답에서 자주 등장하는 중첩 JSON 구조를 처리합니다.StructType으로 추론됨):
심화 학습
스키마 진화 모드 비교 실습
4가지schemaEvolutionMode를 상황별로 비교합니다.
| 모드 | 새 컬럼 발견 시 동작 | 사용 시나리오 |
|---|---|---|
addNewColumns (기본값) | 스키마에 자동 추가 | 소스 스키마가 자주 확장되는 경우 |
rescue | _rescued_data에 JSON으로 보존 | 변경 사항을 사람이 검토 후 반영하는 경우 |
failOnNewColumns | 스트림을 중단하고 에러 발생 | 스키마 변경이 절대 허용되지 않는 경우 |
none | 새 컬럼 무시 (데이터 손실) | 고정 스키마로 엄격히 운영하는 경우 |
트러블슈팅: 타입 충돌 처리
소스 시스템이customer_id를 갑자기 STRING으로 바꾼 경우:
성능 튜닝: 대용량 JSON 처리
정리
핵심 요약
| 개념 | 설명 |
|---|---|
| JSON Lines 포맷 | 한 줄에 하나의 JSON 객체. multiLine=false (기본값) 로 수집합니다 |
| 중첩 구조 자동 추론 | StructType, ArrayType으로 자동 추론됩니다. col("a.b")로 접근합니다 |
schemaEvolutionMode=addNewColumns | 새 컬럼 자동 추가. mergeSchema=true와 함께 사용해야 Delta 테이블도 확장됩니다 |
| 기존 레코드 호환 | 새 컬럼 추가 후 기존 레코드는 해당 컬럼이 NULL로 채워집니다 |
| 타입 충돌 | 기존 컬럼의 타입이 변경되면 자동 처리되지 않습니다. schemaHints 또는 _rescued_data로 처리합니다 |
스키마 진화 의사결정 트리
다음 단계
- SDP와 Auto Loader 통합 —
read_files()함수로 Medallion Architecture (메달리온 아키텍처) 파이프라인을 구축합니다.