Pracuję w notatniku Pythona 3 w Azure DataBricks z iskry 3.0.1.

Mam następujący dataframe

+---+---------+
|ID |Name     |
+---+---------+
|1  |John     |
|2  |Michael  |
+---+---------+

, który można utworzyć za pomocą tego kodu

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)

Próbuję przekształcić go w obiekt, który można serializować w json z pojedynczą właściwością o nazwie Entities, która jest tablicą elementów w Dataframe.

jak to

{
    "Entities": [
        {
            "ID": 1,
            "Name": "John"
        },
        {
            "ID": 2,
            "Name": "Michael"
        }
    ]
}

Próbowałem dowiedzieć się, jak to zrobić, ale tak daleko nie miałem szczęścia. Czy ktoś może wskazywać mnie we właściwym kierunku?

0
Connell.O'Donnell 19 marzec 2021, 23:04

1 odpowiedź

Najlepsza odpowiedź

Spróbuj tego:

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")

Plik wyjściowy:

{
    "Entities": [{
        "id": 1,
        "fname": "John"
    }, {
        "id": 2,
        "fname": "Michael"
    }]
}
1
Hussain Bohra 19 marzec 2021, 23:26