#python #python-3.x #pyspark
Вопрос:
Я работаю в записной книжке Python 3 в базе данных Azure с помощью Spark 3.0.1.
У меня есть следующий фрейм данных
--- ---------
|ID |Name |
--- ---------
|1 |John |
|2 |Michael |
--- ---------
Который может быть создан с помощью этого кода
from pyspark.sql.types import StructType,StructField, StringType, IntegerType
data2 = [(1,"John","Doe"),
(2,"Michael","Douglas")
]
schema = StructType([
StructField("ID",IntegerType(),True),
StructField("Name",StringType(),True),
])
df1 = spark.createDataFrame(data=data2,schema=schema)
df1.show(truncate=False)
Я пытаюсь преобразовать его в объект, в который можно сериализовать json
с помощью одного свойства, называемого Entities
массивом элементов в кадре данных.
Подобный этому
{
"Entities": [
{
"ID": 1,
"Name": "John"
},
{
"ID": 2,
"Name": "Michael"
}
]
}
Я пытался понять, как это сделать, но до сих пор мне не везло. Кто-нибудь может указать мне правильное направление, пожалуйста?
Ответ №1:
попробуйте это:
from pyspark.sql.types import StructType,StructField, StringType, IntegerType
from pyspark.sql import functions as F
data2 = [
(1,"John","Doe"),
(2,"Michael","Douglas")
]
schema = StructType([
StructField("id",IntegerType(),True),
StructField("fname",StringType(),True),
StructField("lname",StringType(),True),
])
df1 = spark.createDataFrame(data2, schema)
df = (
df1
.withColumn("profile", F.struct("id", "fname"))
.groupby()
.agg(F.collect_list("profile").alias("Entities"))
)
df.select("Entities").coalesce(1).write.format('json').save('test', mode="overwrite")
Выходной файл:
{
"Entities": [{
"id": 1,
"fname": "John"
}, {
"id": 2,
"fname": "Michael"
}]
}