← 학습 카테고리

Learn

Spark

84개 모듈 · 현재 72번째

Spark 모듈 72/84 spark-learn-72

Spark 4.0 VARIANT 타입 — JSON을 매번 다시 파싱하지 않는다

Delta Lake Deletion Vectors 및 Spark 4.0 VARIANT 타입 공식 문서·기술 블로그 종합 (웹 리서치, 2026) — Delta Lake 공식 블로그(deletion-vectors), Microsoft Learn(deletion-vectors), Databricks 공식 블로그(introducing-open-variant-data-type) Databricks 공식 블로그 Introducing the Open Variant Data Type in Delta Lake and Apache Spark

이 모듈을 다 읽으면

  • VARIANT가 JSON 문자열을 매번 파싱하는 기존 방식과 근본적으로 무엇이 다른지 설명할 수 있다
  • 이진 인코딩이 오프셋 기반 탐색으로 부분 필드만 읽을 수 있게 한다는 것을 설명할 수 있다

spark-learn-21에서 다룬 JSON 처리(문자열로 저장하고 그때그때 파싱)를 전제로, Spark 4.0이 도입한 VARIANT 타입이 파싱 비용 자체를 색인 시점에 한 번으로 줄이는 방법을 정리한다.

왜 필요한가 — 매번 다시 파싱하는 비용

spark-learn-21에서 다룬 것처럼 전통적으로 JSON은 문자열 컬럼에 그대로 저장되고, get_json_object 같은 함수로 필드를 꺼낼 때마다 그 문자열을 처음부터 다시 파싱한다 — 같은 레코드의 여러 필드를 여러 번 조회하면 그만큼 파싱도 반복된다. VARIANT는 이 문제를 색인(적재) 시점에 딱 한 번만 파싱해서 최적화된 이진(binary) 형식으로 저장하는 방식으로 해결한다 — 이후 읽을 때는 다시 파싱하지 않고 이 이진 표현을 그대로 쓴다.

핵심 포인트

  • 기존 방식(spark-learn-21): JSON을 문자열로 저장 — 필드를 꺼낼 때마다 매번 처음부터 다시 파싱
  • VARIANT: 적재 시점에 한 번만 파싱해 최적화된 이진 형식으로 저장 — 이후 읽기는 재파싱 없이 이 표현을 그대로 사용

이진 인코딩 — 오프셋 기반 탐색으로 부분 필드만 읽는다

이 이진 인코딩은 단순 압축이 아니라 오프셋 기반 탐색을 지원한다 — 중첩된 값 안의 특정 필드 하나를 꺼내려 할 때, 전체 값을 다 읽지 않고도 그 필드까지 바로 이동해 읽을 수 있다는 뜻이다. 또한 정수는 정수로, 불리언은 불리언으로 타입 정보가 깊게 중첩된 필드까지도 그대로 보존된다 — JSON 문자열로 뭉뚱그려 저장했다가 파싱 시점에 타입을 추론하는 방식과 달리, 타입 정보 유실 없이 임의 중첩·혼합 타입·행마다 다른 스키마라는 JSON의 유연성을 그대로 유지한다.

핵심 포인트

  • 오프셋 기반 탐색: 중첩 값 안의 특정 필드로 바로 이동해 읽기 가능, 전체 값을 다 읽을 필요 없음
  • 타입 정보(정수/불리언 등)가 깊게 중첩된 필드까지 보존 — JSON의 임의 중첩·혼합 타입·행마다 다른 스키마라는 유연성은 그대로 유지

Spark 전용 포맷이 아니다 — Parquet·Delta Lake와 공유하는 공개 명세

이 이진 인코딩 포맷은 Spark만의 독자 규격이 아니라 오픈소스 라이브러리로 공개돼, Parquet과 Delta Lake 프로젝트가 같은 명세를 공유한다. 즉 VARIANT로 적재한 데이터는 Spark 생태계 안에서만이 아니라 이 공개 명세를 따르는 다른 도구에서도 재파싱 없이 그대로 활용될 수 있는 상호운용성을 갖는다.

핵심 포인트

  • VARIANT 이진 인코딩은 Spark 독자 규격이 아니라 오픈소스로 공개된 명세 — Parquet·Delta Lake 프로젝트가 동일 명세를 공유
  • 이 공개 명세 덕분에 Spark 생태계 밖의 다른 도구에서도 재파싱 없이 활용 가능한 상호운용성 확보