नेस्टेड json संरचना में pyspark dataframe परिवर्तित करें
Jan 08 2021
मैं नीचे डेटाफ्रेम को नेस्टेड जोंस (स्ट्रिंग) में बदलने की कोशिश कर रहा हूं
इनपुट:
+---+---+-------+------+
| 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 का उपयोग करने की कोशिश की, वांछित ouput प्राप्त करने में सक्षम नहीं था।
जवाब
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"}]|
+---+---+-----------------------------------------------------------------------+