스파크 Spark

[Spark] PySpark에서 struct 구조 분해하기

sseozytank 2024. 5. 10.
 

[Spark] PySpark에서 explode 함수로 array구조 분해하기

https://stackoverflow.com/questions/57811415/reading-a-nested-json-file-in-pyspark   pyspark json을 read 하다가, 구조가 너무 복잡하게 read 되어서 분리하는데 애를 좀 먹었다. array는 쉬운데 struct 구조가 넘 어려웠다..

sseozytank.tistory.com

 

전 포스팅에서, explode 함수로 array 구조를 펼쳤다. 그럼 이번엔 struct 구조의 데이터를 분해해보자. 

from pyspark.sql import functions as F
# 스파크 세션 생성
spark = SparkSession.builder \
    .appName("Struct_Example") \
    .getOrCreate()

data = [(('bigint','id'), 1),
 (('bigint','pwd'), 3),
 (('int','age'),12)]

df = spark.createDataFrame(data, ("schema", "data"))
df.show()

 

스키마 정보가 struct 구조로 되어있는 DataFrame이 있다고 치자. 

나는 저기서 컬럼명 부분만 따오고 싶당. 그럼  schema 컬럼에 있는 저 struct 데이터를 컬럼으로 쪼개주면 바로 select 해올 수있다. columns.구조체요소명 함수를 쓰면 쉽게 가능하다. 

 

columns.*

우선, struct 구조에서는 구조체 컬럼을 불러올 수 있다. 

root
 |-- schema: struct (nullable = true)
 |    |-- _1: string (nullable = true)
 |    |-- _2: string (nullable = true)
 |-- data: long (nullable = true)

 

위에서 이렇게 되어있으면, schema 컬럼의 구조체는 _1과 _2인데, 내가 첫번째 부분만 불러오고 싶으면 아래와 같이 select 해주면 된다. 

df.select(('schema._1')).show()

 

그럼 이렇게, schema 스트럭 구조의 컬럼에서 앞에 있는것만 _1 컬럼으로 분리할 수 있는것. 컬럼명을 바꾸고 싶으면 alias 지정해주면 된다. 

from pyspark.sql.functions import col

df.select(col("schema._1").alias("data_type")).show()

 

*을 통해 , 모든 구조체를 분리해서 컬럼으로 만들 수도 있다. 위처럼 입력하면 아래와 같은 Data Frame이 탄생 (단, *쓸 시 

컬럼명은 다시 지정해줘야함) 

#이렇게 불러오거나 
df.select(col("schema._1").alias("data_type"),col("schema._2").alias("column_name"),'data').show()

#이렇게 불러오자 
df.select('schema.*','data').show()

 

 

 

댓글