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 개념과 활용법을 정리해 보았습니다.
이제 실전 데이터 분석에서 스키마를 활용해 보세요! 😊
'Data & Technology Insights' 카테고리의 다른 글
MosaicML과 Databricks로 LLM 민주화하기 (0) | 2025.03.10 |
---|---|
데이터브릭스 Data + AI World Tour: 데이터 레이크하우스의 미래 (0) | 2025.03.10 |
☁ 가상 서버(Virtual Server)는 실제 서버와 어떻게 다를까? (0) | 2025.03.08 |
데이터브릭스는 클라우드 데이터 처리계의 배달의민족?🚀📦 (1) | 2025.03.08 |
🍽 피자 가게로 이해하는 데이터브릭스! Spark는 ‘요리사 팀’입니다! 🚀 (0) | 2025.03.08 |