pyspark 데이터 프레임을 중첩 된 json 구조로 변환
Jan 08 2021
아래 데이터 프레임을 중첩 된 json (문자열)으로 변환하려고합니다.
입력:
+---+---+-------+------+
| id|age| name |number|
+---+---+-------+------+
| 1| 12| smith| uber|
| 2| 13| jon| lunch|
| 3| 15|jocelyn|rental|
| 3| 15| megan| sds|
+---+---+-------+------+
산출:-
+---+---+--------------------------------------------------------------------+
|id |age|values
|
+---+---+--------------------------------------------------------------------+
|1 |12 |[{"number": "uber", "name": "smith"}]
|
|2 |13 |[{"number": "lunch", "name": "jon"}]
|
|3 |15 |[{"number": "rental", "name": "megan"}, {"number": "sds", "name": "jocelyn"}]|
+---+---+--------------------------------------------------------------------+
내 코드
from pyspark.sql import SparkSession
from pyspark.sql.types import ArrayType, StructField, StructType, StringType, IntegerType
# List
data = [(1,12,"smith", "uber"),
(2,13,"jon","lunch"),(3,15,"jocelyn","rental")
,(3,15,"megan","sds")
]
# Create a schema for the dataframe
schema = StructType([
StructField('id', IntegerType(), True),
StructField('age', IntegerType(), True),
StructField('number', StringType(), True),
StructField('name', StringType(), True)])
# Convert list to RDD
rdd = spark.sparkContext.parallelize(data)
# Create data frame
df = spark.createDataFrame(rdd,schema)
collect_list 및 collect_set을 사용해 보았지만 원하는 출력을 얻을 수 없었습니다.
답변
2 mck Jan 08 2021 at 14:24
당신은 사용할 수 있습니다 collect_list
및 to_json
각 그룹에 대해 jsons의 배열을 수집 :
import pyspark.sql.functions as F
df2 = df.groupBy(
'id', 'age'
).agg(
F.collect_list(
F.to_json(
F.struct('number', 'name')
)
).alias('values')
).orderBy(
'id', 'age'
)
df2.show(truncate=False)
+---+---+-----------------------------------------------------------------------+
|id |age|values |
+---+---+-----------------------------------------------------------------------+
|1 |12 |[{"number":"smith","name":"uber"}] |
|2 |13 |[{"number":"jon","name":"lunch"}] |
|3 |15 |[{"number":"jocelyn","name":"rental"}, {"number":"megan","name":"sds"}]|
+---+---+-----------------------------------------------------------------------+