← 학습 카테고리

Learn

Spark

38개 모듈 · 현재 9번째

Spark 모듈 9/38 spark-learn-09

Structured API의 세 가지 얼굴: DataFrame, Dataset, SQL

Spark: The Definitive Guide (Excerpts, Databricks Preview, 2017) — Chapters 2-6 — Bill Chambers & Matei Zaharia Chapter 4: Structured API Overview - 도입부, DataFrames and Datasets, Schemas 절 (PDF pp.44-47)

이 모듈을 다 읽으면

  • DataFrame, Dataset, SQL View/Table이 내부적으로 어떤 관계인지 설명할 수 있다
  • 트랜스포메이션과 액션의 역할 차이를 구분해 설명할 수 있다
  • 스키마가 DataFrame에서 하는 역할과 schema-on-read 개념을 설명할 수 있다

Spark의 Structured API는 Dataset, DataFrame, SQL View/Table 세 가지 분산 컬렉션 API로 구성되며, 이들은 배치와 스트리밍 양쪽에 동일하게 적용되는 공통 추상화다. DataFrame/Dataset는 불변이고 지연 평가되는 연산 계획을 나타내며, 트랜스포메이션이 DAG를 쌓고 액션이 이를 실행시킨다. 스키마는 컬럼명과 타입을 정의하며, SQL 테이블/뷰는 사실상 DataFrame과 동일한 개체다.

Structured API란 무엇인가

Spark의 구조화 API는 Dataset, DataFrame, SQL View/Table이라는 세 가지 분산 컬렉션 API로 구성된다. 비정형 로그 파일부터 반정형 CSV, 정형 Parquet까지 다양한 형태의 데이터를 다루는 공통 창구 역할을 한다.

중요한 특징은, 이 API들의 대다수 연산이 배치 처리뿐 아니라 스트리밍 처리에도 동일하게 적용된다는 점이다. 즉 Structured API로 작성한 코드는 배치에서 스트리밍으로, 또는 그 반대로 옮길 때 별도의 재작성이 거의 필요 없다.

핵심 포인트

  • Structured API는 Dataset·DataFrame·SQL View/Table 세 가지로 구성된다
  • 동일한 API가 배치와 스트리밍 처리에 모두 적용되어 두 방식 간 전환 비용이 낮다

트랜스포메이션과 액션

Spark는 사용자가 지정하는 트랜스포메이션들을 모아 하나의 방향성 비순환 그래프(DAG)로 구성한다. 이 그래프는 액션이 호출되어야 비로소 실행되며, 이때 Spark는 그래프를 하나의 잡(job)으로 보고 이를 스테이지와 태스크로 쪼개어 클러스터 전체에서 실행한다.

DataFrame과 Dataset은 이러한 트랜스포메이션과 액션을 적용할 대상 데이터를 담는 그릇이다. 다만 실제 데이터를 담고 있다기보다는, 어떤 위치의 데이터에 어떤 연산을 적용해 어떤 결과를 만들지를 나타내는 불변(immutable)이고 지연 평가(lazily-evaluated)되는 계획에 가깝다. 액션을 호출해야 Spark가 실제로 그 계획대로 연산을 수행하고 결과를 돌려준다.

핵심 포인트

  • 트랜스포메이션은 DAG를 쌓아 올리고, 액션이 호출되어야 실제 실행(잡→스테이지→태스크 분해)이 시작된다
  • DataFrame/Dataset은 데이터 자체가 아니라 불변이고 지연 평가되는 연산 계획을 표현한다

스키마와 SQL View의 정체

스키마는 DataFrame의 컬럼명과 각 컬럼의 타입을 정의하는 메타데이터다. 사용자가 직접 수동으로 정의할 수도 있고, 데이터 소스로부터 자동으로 읽어 들일 수도 있는데 이를 schema-on-read라 부른다.

한편 SQL의 테이블(Table)과 뷰(View)는 DataFrame과 본질적으로 같은 대상을 가리킨다. 차이는 그 대상에 대해 DataFrame 코드를 쓰느냐, SQL 문법으로 쿼리를 실행하느냐뿐이다.

핵심 포인트

  • 스키마는 컬럼명·타입을 정의하며 수동 지정 또는 schema-on-read(데이터 소스 추론)로 얻을 수 있다
  • SQL 테이블/뷰는 DataFrame과 동일한 대상을 가리키며 SQL 문법으로 실행할 뿐이다