Data & Technology Insights

💡 PySpark에서 Schema 이해하기

soni-log 2025. 3. 9. 01:02

PySpark에서 **Schema(스키마)**란 DataFrame의 구조(컬럼명, 데이터 타입, Null 허용 여부 등)를 정의하는 정보를 의미합니다.
데이터 분석을 할 때, 데이터의 형식을 미리 확인하고 관리하는 것은 매우 중요합니다.
이번 글에서는 PySpark에서 스키마를 다루는 방법을 정리해 보겠습니다.


1. Schema 확인하기

PySpark에서는 printSchema()를 사용하여 DataFrame의 스키마를 쉽게 확인할 수 있습니다.

DataFrame의 스키마를 출력하는 기본적인 방법은 printSchema()입니다.

예를 들어, 아래와 같은 JSON 파일을 불러왔다고 가정하겠습니다.

 

[ {"name": "Michael", "age": null},
{"name": "Andy", "age": 30},
{"name": "Justin", "age": 19}
]

 

이 데이터를 Spark DataFrame으로 읽고 printSchema()를 실행하면, 다음과 같이 출력됩니다.

 

root
|-- name: string (nullable = true)
|-- age: long (nullable = true)

 

출력 결과를 보면,

  • name 컬럼은 string 타입이고, null 값을 가질 수 있습니다.
  • age 컬럼은 long(정수형) 타입이며, 역시 null을 허용합니다.

2. Schema 자동 추론 vs 명시적 지정

Spark는 기본적으로 자동으로 데이터의 스키마를 추론합니다.
하지만 때로는 명시적으로 스키마를 정의하는 것이 더 안전할 수 있습니다.

✅ 자동 스키마 추론 (Infer Schema)

Spark는 json()이나 csv() 같은 함수를 사용할 때 자동으로 데이터의 형식을 추론합니다.

 

df = spark.read.option("multiline", "true").json("dbfs:/FileStore/people.json")
df.printSchema()

 

이 방법은 편리하지만, 데이터가 많거나 복잡한 경우 예상과 다르게 스키마가 설정될 수도 있습니다.


✅ 명시적으로 Schema 지정하기

명시적으로 스키마를 정의하면, 데이터 타입을 보다 정확하게 설정할 수 있습니다.
특히, null 값이 포함된 경우나, 자동 추론이 잘못되거나, 데이터 타입을 정확히 지정하고 싶을 때 스키마를 직접 설정해야 합니다.

이때 StructType과 StructField를 사용해서 데이터의 구조를 정의할 수 있습니다.

 

✅ StructType

  • PySpark에서 **테이블 전체의 스키마(컬럼 구조)**를 정의할 때 사용하는 객체입니다.
  • 여러 개의 StructField를 포함할 수 있습니다.

✅ StructField

  • 테이블의 각 컬럼(Column)의 정의를 설정하는 역할을 합니다.
  • 컬럼의 이름(name), 데이터 타입(type), Null 값 허용 여부(nullable) 를 지정할 수 있습니다.

✅ StringType, IntegerType

  • Spark에서 사용할 데이터 타입을 지정합니다.
  • StringType()은 문자열 데이터, IntegerType()은 정수 데이터를 의미합니다.

 

from pyspark.sql.types import StructType, StructField, StringType, IntegerType

schema = StructType([StructField("name", StringType(), True), # 문자열, Null 허용
                StructField("age", IntegerType(), True) # 정수형, Null 허용])

df = spark.read.schema(schema).json("dbfs:/FileStore/people.json")
df.printSchema()

 

이렇게 하면 age 컬럼이 long이 아니라 integer로 설정되며, 보다 정확한 데이터 분석이 가능합니다.


3. Schema 변경하기

✅ cast()를 사용한 데이터 타입 변경

만약 기존 DataFrame에서 특정 컬럼의 데이터 타입을 변경하고 싶다면 cast()를 사용할 수 있습니다.

 

from pyspark.sql.functions import col

df = df.withColumn("age", col("age").cast("int"))
df.printSchema()

 

이제 age 컬럼의 타입이 long에서 int로 변경됩니다.


4. Schema 활용 예제

✅ 데이터 저장 시 스키마 지정

스키마를 지정한 후, 데이터를 저장할 수도 있습니다.

 

df.write.mode("overwrite").json("dbfs:/FileStore/people_processed.json")

 

이렇게 하면, 스키마가 적용된 상태로 JSON 파일이 저장됩니다.


정리

PySpark에서 Schema를 다루는 방법을 정리하면 다음과 같습니다.

✔ printSchema()를 사용해 DataFrame의 스키마를 출력할 수 있다.
✔ 데이터를 불러올 때 Spark가 자동으로 형식을 추론하지만, 예상과 다를 수 있다.
✔ StructType을 사용하여 명시적으로 스키마를 정의하면 보다 정확한 데이터 처리가 가능하다.
✔ cast()를 사용하여 특정 컬럼의 데이터 타입을 변환할 수 있다.
✔ 데이터를 저장할 때 스키마를 유지할 수 있다.

Spark에서 데이터를 다룰 때, Schema를 잘 활용하면 오류를 줄이고 데이터 분석을 보다 정확하게 수행할 수 있습니다.
특히, B2B/B2C 데이터 분석을 수행할 때 올바른 데이터 형식이 중요한 만큼, 명시적인 스키마 정의를 적극 활용하는 것이 좋습니다.


PySpark의 schema 개념과 활용법을 정리해 보았습니다.
이제 실전 데이터 분석에서 스키마를 활용해 보세요! 😊