Фрейм данных PySpark — Создайте столбец из другого фрейма данных

#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"
    }]
}