DataFrame Schema 정의 방법 이해하기

DataFrame은 각 컬럼의 이름(Name)데이터 타입(Data Type) 을 정의하는
Schema를 가지고 있습니다.

DataFrame의 Schema를 확인하려면 printSchema 메서드를 사용합니다.

1
customerDF.printSchema()

이 명령을 실행하면 DataFrame의 Schema가
사람이 읽기 쉬운 형태로 출력됩니다.


1. 왜 Schema를 직접 정의해야 할까?

예를 들어, 데이터 파일을 보면 address_id 컬럼의 값은 크지 않습니다.
하지만 Spark는 자동으로 이를 Long 타입으로 인식할 수 있습니다.

이 경우:

  • Long 타입은 불필요하게 큰 타입이고
  • Integer 타입으로 충분한 상황입니다

따라서 Schema를 직접 정의하여 데이터 타입을 정확히 지정하는 것이 좋습니다.


2. Schema를 정의하는 첫 번째 방법: DDL 문자열 방식

DataFrame Schema를 정의하는 첫 번째 방법은
DDL(Data Definition Language) 형식의 문자열을 사용하는 것입니다.

DDL 문자열은:

  • 컬럼 이름
  • 컬럼 데이터 타입

을 문자열 형태로 나열한 것입니다.


DDL Schema 정의 절차

  1. Schema 정보를 담을 변수를 생성합니다
    변수 이름 예시: customerDFSchemaDDL

  2. 문자열 안에 각 컬럼의 이름과 데이터 타입을 순서대로 작성합니다

예를 들어:

  • address_id → Integer
  • birth_country → String
  • birth_date → Date

데이터 타입 지정 시 주의 사항

예를 들어 birth_date 컬럼은:

  • 원본 JSON 파일에서는 문자열(String) 형태로 저장되어 있지만
  • 실제 의미는 날짜(Date)입니다

따라서 Schema를 수동으로 정의할 때는
실제 의미에 맞는 데이터 타입(Date)을 지정해야 합니다.


DDL Schema 적용

DDL 문자열을 정의한 후에는
DataFrame을 생성할 때 schema 옵션으로 적용합니다.

이렇게 하면 Spark는:

  • 자동 추론이 아니라
  • 우리가 지정한 Schema를 그대로 사용합니다

Schema 변경 결과 확인

다시 customerDF.printSchema()를 실행하면:

  • 이전에는 address_id가 Long 타입
  • 이제는 Integer 타입
  • birth_date는 String → Date

로 변경된 것을 확인할 수 있습니다.


3. Schema를 정의하는 두 번째 방법: StructType 사용

두 번째 방법은
StructType과 StructField를 직접 사용하는 방식입니다.


기존 DataFrame의 Schema 확인

DataFrame에는 schema라는 속성이 있습니다.

customerDF.schema

이 값을 출력해 보면:

  • 문자열이 아니라
  • Apache Spark의 StructType 객체 형태로 Schema가 반환됩니다

StructType은:

  • 여러 개의 StructField로 구성되고
  • 각 StructField는 다음 정보를 포함합니다
    • 컬럼 이름
    • 데이터 타입
    • nullable 여부

nullable 플래그는:

  • Spark 내부 최적화를 위한 힌트일 뿐이며
  • false라고 해서 null 값이 실제로 없는 것은 아닙니다

StructType Schema 직접 정의하기

StructType은:

  • StructField들의 컬렉션이며
  • 복합 타입(Struct 안에 Struct, Array 등)도 표현할 수 있습니다

demographics 컬럼은:

  • StructType 안에
  • Array 타입 필드를 포함하는
  • 복합 컬럼의 예시입니다

필요한 패키지 Import

StructType을 사용하려면 다음 패키지를 import 해야 합니다.

import org.apache.spark.sql.types._


StructType Schema 적용

StructType Schema 역시
DataFrameReader의 schema 메서드에 그대로 전달할 수 있습니다.

DDL 문자열과 StructType은
동일한 결과를 만들어 냅니다.


4. Schema를 정의하는 세 번째 방법: Infer Schema

세 번째 방법은
Apache Spark에게 Schema 추론을 맡기는 방식입니다.

이를 위해 DataFrameReader에 옵션을 추가합니다.

1
option("inferSchema", "true")

Spark는:

  • 일부 데이터를 먼저 읽고
  • 데이터 타입을 추론한 뒤
  • 전체 데이터를 다시 읽습니다

Infer Schema의 단점

Infer Schema 방식은:

  • 데이터를 두 번 읽기 때문에 성능 비용이 발생하고
  • Integer와 Long을 정확히 구분하지 못할 수 있습니다

따라서 운영 환경에서는 Schema를 직접 정의하는 것이 권장됩니다.


5. Apache Spark 문서 활용 방법 (시험 대비 핵심)

시험 준비 시 매우 중요한 역량은
Apache Spark 공식 문서를 빠르게 찾고 읽는 능력입니다.


DataFrameReader 문서 확인

Apache Spark 공식 문서에서:

  • 최신 버전 선택
  • Scala API 문서 선택
  • DataFrameReader 검색

이를 통해 다음을 확인할 수 있습니다.

  • format 메서드의 정확한 시그니처
  • json 메서드 사용법
  • option, load 등 모든 사용 가능한 API

문서 활용의 중요성

시험 문제 예시:

  • format 메서드는 몇 개의 인자를 받는가?
  • inferSchema 옵션은 어떻게 사용하는가?

이런 문제는:

  • 문서를 읽을 수 있다면
  • 바로 답을 찾을 수 있습니다

6. 정리

이번 강의에서 배운 내용:

  • DataFrame Schema 확인 방법
  • Schema 정의 3가지 방법
    • DDL 문자열
    • StructType
    • Infer Schema
  • 운영 환경에서는 Schema 수동 정의 권장
  • Apache Spark 문서 활용 방법

다음 강의에서는:

  • DataFrameReader의 다양한 옵션
  • JSON 외 다른 데이터 소스 읽기

를 살펴보겠습니다.