본문 바로가기
데이터 처리 및 변환 (transform)

데이터 평탄화(flatten) spark로 json 평탄화하기

by goemgoem-i 2025. 1. 9.
반응형

최근에 데이터 api를 수집한다고 json파일을 많이쓰고 있다 

json은 파일이 굉장히 가벼워서 대용량 정보를 가져오긴 굉장히 좋지만 보기는 힘들다

그렇기 때문에 데이터 평탄화 작업을 한다고 하는데 

이 중 대표적으로 평탄화 할 때 사용하는 건 바로 Spark다 

 

Spark는 JSON의 중첩(nested) 구조를 다루고, 이를 평탄화된 형태로 변환하는 데 매우 유용한 도구이다

PySpark(Spark의 Python API)는 JSON 데이터를 처리하고 변환하는 데 자주 사용한다고 한다

 

 

왜 Spark를 사용하나?

  1. JSON 처리에 적합
    • Spark는 JSON 데이터를 쉽게 읽고 구조를 이해할 수 있는 기능을 제공한다
    • 중첩된 구조를 자동으로 파악하여 이를 DataFrame으로 변환
  2. 대규모 데이터 처리
    • Spark는 분산 처리 프레임워크로 설계되어, JSON과 같은 대규모 데이터를 빠르게 처리할 수 있다
  3. 유연한 데이터 변환
    • Spark는 중첩된 필드를 쉽게 선택하거나, 별도의 열(column)로 변환하는 작업을 간단히 수행할 수 있다
  4. 파일 변환과 연계
    • JSON 데이터를 평탄화한 후 바로 Parquet, ORC, CSV 등으로 저장할 수 있다

 

JSON 평탄화를 Spark로 처리하는 방법

1. JSON 데이터 읽기

Spark는 JSON 데이터를 자동으로 분석하고, 중첩된 필드를 포함한 스키마를 생성

from pyspark.sql import SparkSession

# Spark 세션 생성
spark = SparkSession.builder.appName("JSONFlatten").getOrCreate()

# JSON 파일 읽기
json_df = spark.read.json("s3://your-bucket/path-to-json/")
json_df.printSchema()

2. JSON 데이터의 중첩 구조

#json파일의 예시
{
  "id": 1,
  "name": "Alice",
  "address": {
    "city": "New York",
    "zip": "10001"
  }
}


#spark는 아래와 같은 스키마 자동 생성
root
 |-- id: integer (nullable = true)
 |-- name: string (nullable = true)
 |-- address: struct (nullable = true)
 |    |-- city: string (nullable = true)
 |    |-- zip: string (nullable = true)

3. 평탄화 작업

Spark의 selectalias 기능을 사용해 중첩된 필드를 평탄화

from pyspark.sql.functions import col

# 중첩된 필드 평탄화
flattened_df = json_df.select(
    col("id"),
    col("name"),
    col("address.city").alias("address_city"),
    col("address.zip").alias("address_zip")
)

flattened_df.show()


#출력
+---+-----+------------+-----------+
| id| name|address_city|address_zip|
+---+-----+------------+-----------+
|  1|Alice|   New York |      10001|
+---+-----+------------+-----------+

 

4. 평탄화된 데이터 저장

평탄화된 데이터를 Parquet 또는 다른 포맷으로 저장

flattened_df.write.parquet("s3://your-bucket/flattened-data/")

 

 

 

 

 

Spark 없이 JSON 평탄화를 하는 경우

Spark 없이 JSON 데이터를 평탄화 가능하다

Python의 pandas, json_normalize, 또는 수작업으로 처리해야한다

  • 대규모 데이터셋 처리 가능
  • 효율적인 분산 처리
  • S3, HDFS 등 다양한 데이터 소스와의 연계
반응형