주요 컨텐츠로 이동

Delta Lake와 Apache Spark의 오픈 Variant 데이터 타입 소개

반정형 데이터로 작업할 때 더 빠른 처리와 유연성 향상
Kent Marten
Gene Pang
Chenhao Li
Han Xiao
이 포스트 공유하기

반정형(semi-strutured) 데이터를 위한 새로운 Variant 데이터 타입을 발표하게 되어 기쁘게 생각합니다. Variant 타입은 고도로 중첩되고 진화하는 스키마를 지원할 수 있는 유연성을 유지하면서 이러한 데이터를 JSON 문자열로 저장할 때보다 훨씬 향상된 성능을 제공합니다.

반정형 데이터 작업은 오랫동안 레이크하우스의 기본 기능으로 자리 잡았습니다. 엔드포인트 탐지 및 대응(EDR), 광고 클릭 분석, IoT 텔레메트리는 반정형 데이터를 사용하는 인기 있는 사용 사례 중 일부입니다. 점점 더 많은 고객들이 상용 데이터 웨어하우스에서 마이그레이션하면서 이러한 상용 웨어하우스가 제공하는 variant 데이터 유형에 의존하고 있으며, 이에 대한 오픈소스 표준을 통해 lock-in을 피할 수 있기를 바란다는 이야기를 들었습니다.

오픈 variant 타입은 Apache Spark 오픈소스 커뮤니티와 리눅스 재단 Delta Lake 커뮤니티와의 협업의 결과물입니다:

  • Variant 데이터 타입, Variant 바이너리 표현식, Variant 바이너리 인코딩 포맷은 이미 오픈소스 Spark에 추가되어 있습니다. 바이너리 인코딩에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
  • 바이너리 인코딩 포맷은 문자열에 비해 데이터에 더 빠르게 액세스하고 탐색할 수 있습니다. Variant 바이너리 인코딩 포맷의 구현은 다른 프로젝트에서 사용할 수 있도록 오픈소스 라이브러리에 패키징되어 있습니다.
  • Variant 데이터 타입에 대한 지원도 Delta에 오픈소스화되어 있으며, 프로토콜 RFC는 여기에서 확인할 수 있습니다. Variant 지원은 Spark 4.0과 Delta 4.0에 포함될 예정입니다.
  골드만 삭스의 최고 데이터 책임자이자 데이터 엔지니어링 책임자인 Neema Raphael은 "우리는 우리의 오픈소스 데이터 플랫폼인 Legend를 통해 데이터에 중점을 둔 오픈소스 커뮤니티의 지지자입니다."라고 말합니다. "Spark의 오픈소스 Variant 출시는 오픈 데이터 생태계를 위한 또 하나의 큰 진전입니다."

그리고 DBR 15.3부터는 앞서 언급한 모든 기능을 고객이 사용할 수 있게 됩니다.

Variant 란?

Variant는 반정형 데이터를 저장하기 위한 새로운 데이터 타입입니다. 곧 출시될 데이터브릭스 런타임 15.3 릴리즈의 공개 프리뷰에서는 JSON을 통한 계층형 데이터의 ingress 및 egress가 지원될 예정입니다. Variant가 나오기 전에는 고객은 유연성과 성능 중 하나를 선택해야 했습니다. 유연성을 유지하기 위해 JSON을 단일 컬럼에 문자열로 저장했습니다. 더 나은 성능을 보려면 struct를 사용하여 엄격한 스키마를 정의하는 접근법을 적용해야 했는데, 여기에는 스키마 변경에 따른 유지 관리와 업데이트를 위해 별도의 프로세스가 필요했습니다. Variant를 사용하면 고객은 명시적인 스키마 정의가 필요 없는 유연성을 유지하면서, JSON을 문자열로 쿼리할 때보다 훨씬 향상된 성능을 얻을 수 있습니다.

Variant는 JSON 소스의 스키마가 알려지지 않았거나 변할 수 있거나자주 진화하는 경우 특히 유용합니다. 예를 들어, 고객들은 서로 다른 JSON 스키마를 포함하는 로그를 읽고 결합해야 하는 엔드포인트 탐지 및 대응(EDR) 사용 사례를 공유해 왔습니다. 마찬가지로 스키마를 알 수 없고 항상 변경되는 광고 클릭과 애플리케이션 원격 측정과 관련된 용도의 경우, Variant가 적합합니다. 두 경우 모두 Variant 데이터 타입의 유연성 덕분에 명시적인 스키마 없이도 데이터를 수집하고 성능을 발휘할 수 있습니다.

성능 벤치마크

Variant는 JSON을 문자열로 유지하는 기존 워크로드에 비해 향상된 성능을 제공합니다. 고객 데이터에서 영감을 얻은 스키마로 여러 벤치마크를 실행하여 String과 Variant의 성능을 비교했습니다. 중첩 스키마와 플랫 스키마 모두에서 Variant의 성능이 String 열에 비해 8배 향상되었습니다. 벤치마크는 데이터브릭스 런타임 15.0에서 Photon을 활성화한 상태에서 수행되었습니다.

Performance Benchmarks

Variant 사용 방법

Variant 타입을 지원하기 위한 여러 가지 새로운 함수가 추가되어 variant의 스키마를 검사하고, variant 컬럼을 분해(explode)하고, JSON으로 변환할 수 있습니다. PARSE_JSON() 함수는 JSON 문자열을 입력받아 variant 값을 반환하는 데 흔히 사용됩니다.

-- SQL example
SELECT PARSE_JSON(json_str_col) FROM T

# python example
df.select(parse_json(json_str_col))

Variant 데이터를 로드하려면 Variant 타입으로 테이블 컬럼을 만들면 됩니다. PARSE_JSON() 함수를 사용하여 JSON 형식의 문자열을 Variant 타입으로 변환한 다음 Variant 컬럼에 삽입할 수 있습니다.

CREATE TABLE T (variant_col Variant);
INSERT INTO T (variant_col) SELECT PARSE_JSON(json_str_col) ... ;

CTAS를 사용하여 Variant 컬럼이 있는 테이블을 만들 수 있습니다. 생성되는 테이블의 스키마는 쿼리 결과에서 파생됩니다. 따라서 Variant 컬럼이 있는 테이블을 만들려면 쿼리 결과에 출력 스키마에 Variant 컬럼이 있어야 합니다.

-- Table T will have a single column: variant_col Variant
CREATE TABLE T AS SELECT PARSE_JSON(json_str) variant_col FROM data

-- Table T will have 2 columns: id, variant_col Variant
CREATE TABLE T AS SELECT id, PARSE_JSON(json_str) variant_col FROM data

COPY INTO를 사용하여 JSON 데이터를 하나 이상의 Variant 컬럼이 있는 테이블에 복사할 수도 있습니다.

CREATE TABLE T (name Variant)
COPY INTO T FROM ...
    FILEFORMAT = JSON
    FORMAT_OPTIONS ('singleVariantColumn' = 'name')

경로 탐색은 직관적인 점(dot) 표기 구문을 따릅니다.

// Path navigation of a variant column
SELECT variant_col:a.b.c::int, variant_col:arr[1].field::double 
FROM T

완전한 오픈 소스, 독점 데이터 lock-in 없음

다시 정리해 보겠습니다:

  1. Variant 데이터 타입, 바이너리 표현식, 바이너리 인코딩 포맷은 이미 Apache Spark에 추가되어 있습니다. 바이너리 인코딩 포맷은 여기에서 자세히 살펴볼 수 있습니다.
  2. 바이너리 인코딩 포맷은 문자열과 비교할 때 데이터에 더 빠르게 액세스하고 탐색할 수 있는 형식입니다. 바이너리 인코딩 포맷의 구현은 다른 프로젝트에서 사용할 수 있도록 오픈소스 라이브러리에 패키징되어 있습니다.
  3. Variant 데이터 타입에 대한 지원도 Delta에 오픈소스화되어 있으며, 프로토콜 RFC는 여기에서 확인할 수 있습니다. Variant 지원은 Spark 4.0과 Delta 4.0에 포함될 예정입니다.

나아가, 우리는 Variant 타입에 대한 shredding/서브 컬럼화를 구현할 계획이 있습니다. Shredding은 Variant 데이터 내의 특정 경로를 쿼리하는 성능을 개선하기 위한 기술입니다. Shredding을 사용하면 경로를 자체 컬럼에 저장할 수 있으므로 해당 경로를 쿼리하는 데 필요한 IO와 계산을 줄일 수 있습니다. 또한, Shredding을 통해 데이터를 잘라내어 불필요한 추가 작업을 피할 수 있습니다. Shredding은 Apache Spark와 Delta Lake에서도 사용할 수 있습니다.

올해 DATA + AI Summit 행사에서 열린 Variant 기술 세션을 참조하세요: "Variant Data Type - Making Semi-Structured Data Fast and Simple".

Variant는 곧 데이터브릭스 런타임 15.3의 공개 프리뷰 및 DBSQL 프리뷰 채널에서 기본적으로 활성화될 예정입니다. 반정형 데이터 사용 사례를 테스트해 보고 의견이나 질문이 있으면 데이터브릭스 커뮤니티 포럼에서 대화를 시작하세요. 커뮤니티의 의견을 듣고 싶습니다!

 

(번역: Youngkyong Ko)  Original Post

Databricks 무료로 시작하기

관련 포스트

모든 엔지니어링 블로그 포스트 보기