PySpark DataFrame converteren naar JSON

Pyspark Dataframe Converteren Naar Json



Het verzenden van gestructureerde gegevens met behulp van JSON is mogelijk en verbruikt ook weinig geheugen. In vergelijking met PySpark RDD of PySpark DataFrame verbruikt JSON weinig geheugen en serialisatie, wat mogelijk is met JSON. We kunnen het PySpark DataFrame naar JSON converteren met behulp van de methode pyspark.sql.DataFrameWriter.json(). Afgezien daarvan zijn er nog twee andere manieren om het DataFrame naar JSON te converteren.

Onderwerp van de inhoud:

Laten we in alle voorbeelden een eenvoudig PySpark DataFrame bekijken en dit omzetten in JSON met behulp van de genoemde functies.







Vereiste module:

Installeer de PySpark-bibliotheek in uw omgeving als deze nog niet is geïnstalleerd. U kunt de volgende opdracht raadplegen om het te installeren:



pip installeer pyspark

PySpark DataFrame naar JSON met behulp van To_json() met ToPandas()

De methode to_json() is beschikbaar in de Pandas-module die het Pandas DataFrame converteert naar JSON. We kunnen deze methode gebruiken als we onze PySpark DataFrame converteren naar Pandas DataFrame. Om het PySpark DataFrame naar Pandas DataFrame te converteren, wordt de toPandas() methode gebruikt. Laten we de syntaxis van to_json() samen met de bijbehorende parameters bekijken.



Syntaxis:





dataframe_object.toPandas().to_json(oriënteren,indexeren,...)
  1. Orient wordt gebruikt om de geconverteerde JSON weer te geven als het gewenste formaat. Er zijn 'records', 'tabel', 'waarden', 'kolommen', 'index', 'splitsen' voor nodig.
  2. Index wordt gebruikt om de index op te nemen in/te verwijderen uit de geconverteerde JSON-tekenreeks. Als deze is ingesteld op 'True', worden de indices weergegeven. Anders worden de indices niet weergegeven als de oriëntatie 'gesplitst' of 'tabel' is.

Voorbeeld 1: Oriënteren als 'Records'

Maak een 'skills_df' PySpark DataFrame met 3 rijen en 4 kolommen. Converteer dit DataFrame naar JSON door de parameter orient op te geven als 'records'.

pyspark importeren

panda's importeren

importeer vanuit pyspark.sql SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Linux-tip' ).getOrCreate()

# vaardigheidsgegevens met 3 rijen en 4 kolommen

vaardigheden =[{ 'ID kaart' : 123 , 'persoon' : 'Honing' , 'vaardigheid' : 'schilderen' , 'prijs' : 25000 },

{ 'ID kaart' : 112 , 'persoon' : 'Mouni' , 'vaardigheid' : 'dans' , 'prijs' : 2000 },

{ 'ID kaart' : 153 , 'persoon' : 'Tulasi' , 'vaardigheid' : 'lezing' , 'prijs' : 1200 }

]

# maak het vaardigheidsdataframe van de bovenstaande gegevens

skills_df = linuxhint_spark_app.createDataFrame(vaardigheden)

# Actuele vaardigheidsgegevens

skills_df.show()

# Converteer naar JSON met to_json() met orient als 'records'

json_skills_data = skills_df.toPandas().to_json(orient= 'records' )

print(json_skills_data)

Uitgang:



+---+------+-----+--------+

| id|persoon|prijs| vaardigheid|

+---+------+-----+--------+

| 123 | Honing| 25000 |schilderij|

| 112 | Mouni| 2000 | dans|

| 153 |Tulasi| 1200 | lezen|

+---+------+-----+--------+

[{ 'ID kaart' : 123 , 'persoon' : 'Honing' , 'prijs' : 25000 , 'vaardigheid' : 'schilderen' },{ 'ID kaart' : 112 , 'persoon' : 'Mouni' , 'prijs' : 2000 , 'vaardigheid' : 'dans' },{ 'ID kaart' : 153 , 'persoon' : 'Tulasi' , 'prijs' : 1200 , 'vaardigheid' : 'lezing' }]

We kunnen zien dat het PySpark DataFrame wordt geconverteerd naar de JSON-array met een waardenwoordenboek. Hier vertegenwoordigen de sleutels de kolomnaam en vertegenwoordigt de waarde de rij-/celwaarde in het PySpark DataFrame.

Voorbeeld 2: Oriënteer als 'Split'

Het JSON-formaat dat wordt geretourneerd door de 'gesplitste' oriëntatie omvat de kolomnamen met een lijst met kolommen, een lijst met indexen en een lijst met gegevens. Het volgende is het formaat van de 'gesplitste' oriëntatie.

# Converteer naar JSON met behulp van to_json() met orient als 'split'

json_skills_data = skills_df.toPandas().to_json(orient= 'gespleten' )

print(json_skills_data)

Uitgang:

{ 'kolommen' :[ 'ID kaart' , 'persoon' , 'prijs' , 'vaardigheid' ], 'inhoudsopgave' :[ 0 , 1 , 2 ], 'gegevens' :[[ 123 , 'Honing' , 25000 , 'schilderen' ],[ 112 , 'Mouni' , 2000 , 'dans' ],[ 153 , 'Tulasi' , 1200 , 'lezing' ]]}

Voorbeeld 3: oriënteren als 'Index'

Hier wordt elke rij uit het PySpark DataFrame buiten gebruik gesteld in de vorm van een woordenboek met de sleutel als kolomnaam. Voor elk woordenboek wordt de indexpositie als sleutel opgegeven.

# Converteer naar JSON met to_json() met orient als 'index'

json_skills_data = skills_df.toPandas().to_json(orient= 'inhoudsopgave' )

print(json_skills_data)

Uitgang:

{ '0' :{ 'ID kaart' : 123 , 'persoon' : 'Honing' , 'prijs' : 25000 , 'vaardigheid' : 'schilderen' }, '1' :{ 'ID kaart' : 112 , 'persoon' : 'Mouni' , 'prijs' : 2000 , 'vaardigheid' : 'dans' }, '2' :{ 'ID kaart' : 153 , 'persoon' : 'Tulasi' , 'prijs' : 1200 , 'vaardigheid' : 'lezing' }}

Voorbeeld 4: oriënteren als 'kolommen'

Kolommen zijn de sleutel voor elk record. Elke kolom bevat een woordenboek dat de kolomwaarden met indexnummers bevat.

# Converteren naar JSON met to_json() met oriënteren als 'kolommen'

json_skills_data = skills_df.toPandas().to_json(orient= 'kolommen' )

print(json_skills_data)

Uitgang:

{ 'ID kaart' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'persoon' :{ '0' : 'Honing' , '1' : 'Mouni' , '2' : 'Tulasi' }, 'prijs' :{ '0' : 25000 , '1' : 2000 , '2' : 1200 }, 'vaardigheid' :{ '0' : 'schilderen' , '1' : 'dans' , '2' : 'lezing' }}

Voorbeeld 5: oriënteren als 'waarden'

Als u alleen de waarden in JSON nodig heeft, kunt u kiezen voor de oriëntatie 'waarden'. Het toont elke rij in een lijst. Ten slotte worden alle lijsten opgeslagen in een lijst. Deze JSON is van het type geneste lijst.

# Converteer naar JSON met behulp van to_json() met orient als 'waarden'

json_skills_data = skills_df.toPandas().to_json(orient= 'waarden' )

print(json_skills_data)

Uitgang:

[[ 123 , 'Honing' , 25000 , 'schilderen' ],[ 112 , 'Mouni' , 2000 , 'dans' ],[ 153 , 'Tulasi' , 1200 , 'lezing' ]]

Voorbeeld 6: Oriënteer als 'Tabel'

De 'tabel' -oriëntatie retourneert de JSON die het schema bevat met veldnamen samen met de kolomgegevenstypen, de index als primaire sleutel en de Panda's-versie. De kolomnamen met waarden worden weergegeven als 'gegevens'.

# Converteer naar JSON met to_json() met orient als 'table'

json_skills_data = skills_df.toPandas().to_json(orient= 'tafel' )

print(json_skills_data)

Uitgang:

{ 'schema' :{ 'velden' :[{ 'naam' : 'inhoudsopgave' , 'type' : 'geheel getal' },{ 'naam' : 'ID kaart' , 'type' : 'geheel getal' },{ 'naam' : 'persoon' , 'type' : 'snaar' },{ 'naam' : 'prijs' , 'type' : 'geheel getal' },{ 'naam' : 'vaardigheid' , 'type' : 'snaar' }], 'hoofdsleutel' :[ 'inhoudsopgave' ], 'panda's_versie' : '1.4.0' }, 'gegevens' :[{ 'inhoudsopgave' : 0 , 'ID kaart' : 123 , 'persoon' : 'Honing' , 'prijs' : 25000 , 'vaardigheid' : 'schilderen' },{ 'inhoudsopgave' : 1 , 'ID kaart' : 112 , 'persoon' : 'Mouni' , 'prijs' : 2000 , 'vaardigheid' : 'dans' },{ 'inhoudsopgave' : 2 , 'ID kaart' : 153 , 'persoon' : 'Tulasi' , 'prijs' : 1200 , 'vaardigheid' : 'lezing' }]}

Voorbeeld 7: met indexparameter

Eerst geven we de indexparameter door door deze in te stellen op 'True'. U ziet voor elke kolomwaarde dat de indexpositie wordt geretourneerd als een sleutel in een woordenboek.

In de tweede uitvoer worden alleen de kolomnamen ('columns') en records ('data') geretourneerd zonder de indexposities, aangezien de index is ingesteld op 'False'.

# Converteer naar JSON met to_json() met index=True

json_skills_data = skills_df.toPandas().to_json(index=True)

print(json_skills_data, ' \N ' )

# Converteer naar JSON met to_json() met index=False

json_skills_data= skills_df.toPandas().to_json(index=False,orient= 'gespleten' )

print(json_skills_data)

Uitgang:

{ 'ID kaart' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'persoon' :{ '0' : 'Honing' , '1' : 'Mouni' , '2' : 'Tulasi' }, 'prijs' :{ '0' : 25000 , '1' : 2000 , '2' : 1200 }, 'vaardigheid' :{ '0' : 'schilderen' , '1' : 'dans' , '2' : 'lezing' }}

{ 'kolommen' :[ 'ID kaart' , 'persoon' , 'prijs' , 'vaardigheid' ], 'gegevens' :[[ 123 , 'Honing' , 25000 , 'schilderen' ],[ 112 , 'Mouni' , 2000 , 'dans' ],[ 153 , 'Tulasi' , 1200 , 'lezing' ]]

PySpark DataFrame naar JSON met behulp van ToJSON()

De methode toJSON() wordt gebruikt om het PySpark DataFrame naar een JSON-object te converteren. Kortom, het retourneert een JSON-tekenreeks die wordt omgeven door een lijst. De [‘{kolom:waarde,…}’,…. ] is het formaat dat door deze functie wordt geretourneerd. Hier wordt elke rij uit het PySpark DataFrame geretourneerd als een woordenboek met de kolomnaam als sleutel.

Syntaxis:

dataframe_object.toJSON()

Het kan mogelijk zijn om de parameters zoals de index, kolomlabels en gegevenstype door te geven.

Voorbeeld:

Maak een 'skills_df' PySpark DataFrame met 5 rijen en 4 kolommen. Converteer dit DataFrame naar JSON met behulp van de methode toJSON().

pyspark importeren

importeer vanuit pyspark.sql SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Linux-tip' ).getOrCreate()

# vaardigheidsgegevens met 5 rijen en 4 kolommen

vaardigheden =[{ 'ID kaart' : 123 , 'persoon' : 'Honing' , 'vaardigheid' : 'schilderen' , 'prijs' : 25000 },

{ 'ID kaart' : 112 , 'persoon' : 'Mouni' , 'vaardigheid' : 'muziek/dans' , 'prijs' : 2000 },

{ 'ID kaart' : 153 , 'persoon' : 'Tulasi' , 'vaardigheid' : 'lezing' , 'prijs' : 1200 },

{ 'ID kaart' : 173 , 'persoon' : 'rende' , 'vaardigheid' : 'muziek' , 'prijs' : 2000 },

{ 'ID kaart' : 43 , 'persoon' : 'Kamala' , 'vaardigheid' : 'lezing' , 'prijs' : 10000 }

]

# maak het vaardigheidsdataframe van de bovenstaande gegevens

skills_df = linuxhint_spark_app.createDataFrame(vaardigheden)

# Actuele vaardigheidsgegevens

skills_df.show()

# Converteren naar JSON-array

json_skills_data = skills_df.toJSON().collect()

print(json_skills_data)

Uitgang:

+---+------+-----+-----------+

| id|persoon|prijs| vaardigheid|

+---+------+-----+-----------+

| 123 | Honing| 25000 | schilderen|

| 112 | Mouni| 2000 |muziek/dans|

| 153 |Tulasi| 1200 | lezen|

| 173 | liep| 2000 | muziek|

| 43 |Kamala| 10000 | lezen|

+---+------+-----+-----------+

[ '{'id':123,'person':'Schat','prijs':25000,'skill':'schilderen'}' , '{'id':112,'person':'Mouni','prijs':2000,'skill':'muziek/dans'}' , '{'id':153,'person':'Tulasi','prijs':1200,'skill':'lezen'}' , '{'id':173,'person':'Ran','prijs':2000,'skill':'muziek'}' , '{'id':43,'person':'Kamala','prijs':10000,'skill':'lezen'}' ]

Er zijn 5 rijen in het PySpark DataFrame. Al deze 5 rijen worden geretourneerd als een woordenboek van tekenreeksen die worden gescheiden door komma's.

PySpark DataFrame naar JSON met behulp van Write.json()

De methode write.json() is beschikbaar in PySpark die het PySpark DataFrame naar een JSON-bestand schrijft/opslaat. Het neemt de bestandsnaam/het pad als parameter. Kortom, het retourneert de JSON in meerdere bestanden (gepartitioneerde bestanden). Om ze allemaal in één bestand samen te voegen, kunnen we de methode coalesce() gebruiken.

Syntaxis:

dataframe_object.coalesce( 1 .write.json(‘bestandsnaam’)
  1. Toevoegen-modus – dataframe_object.write.mode(‘toevoegen’).json(‘bestandsnaam’)
  2. Overschrijfmodus – dataframe_object.write.mode(‘overschrijven’).json(‘bestandsnaam’)

Het kan mogelijk zijn om de bestaande JSON toe te voegen/overschrijven. Met behulp van de write.mode() kunnen we de gegevens toevoegen door 'append' door te geven of de bestaande JSON-gegevens overschrijven door 'overwrite' aan deze functie door te geven.

Voorbeeld 1:

Maak een 'skills_df' PySpark DataFrame met 3 rijen en 4 kolommen. Schrijf dit DataFrame naar JSON.

pyspark importeren

panda's importeren

importeer vanuit pyspark.sql SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Linux-tip' ).getOrCreate()

# vaardigheidsgegevens met 3 rijen en 4 kolommen

vaardigheden =[{ 'ID kaart' : 123 , 'persoon' : 'Honing' , 'vaardigheid' : 'schilderen' , 'prijs' : 25000 },

{ 'ID kaart' : 112 , 'persoon' : 'Mouni' , 'vaardigheid' : 'dans' , 'prijs' : 2000 },

{ 'ID kaart' : 153 , 'persoon' : 'Tulasi' , 'vaardigheid' : 'lezing' , 'prijs' : 1200 }

]

# maak het vaardigheidsdataframe van de bovenstaande gegevens

skills_df = linuxhint_spark_app.createDataFrame(vaardigheden)

# schrijf.json()

vaardigheden_df.coalesce( 1 .write.json( 'skills_data' )

JSON-bestand:

We kunnen zien dat de map skills_data de gepartitioneerde JSON-gegevens bevat.

Laten we het JSON-bestand openen. We kunnen zien dat alle rijen uit het PySpark DataFrame worden omgezet in JSON.

Er zijn 5 rijen in het PySpark DataFrame. Al deze 5 rijen worden geretourneerd als een woordenboek van tekenreeksen die worden gescheiden door komma's.

Voorbeeld 2:

Maak een 'skills2_df' PySpark DataFrame met één rij. Voeg één rij toe aan het vorige JSON-bestand door de modus op te geven als 'toevoegen'.

pyspark importeren

panda's importeren

importeer vanuit pyspark.sql SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Linux-tip' ).getOrCreate()

vaardigheden2 =[{ 'ID kaart' : 78 , 'persoon' : 'Maria' , 'vaardigheid' : 'rijden' , 'prijs' : 8960 }

]

# maak het vaardigheidsdataframe van de bovenstaande gegevens

skills2_df = linuxhint_spark_app.createDataFrame(skills2)

# write.json() met toevoegmodus.

skills2_df.write.mode( 'toevoegen' .json( 'skills_data' )

JSON-bestand:

We kunnen de gepartitioneerde JSON-bestanden zien. Het eerste bestand bevat de eerste DataFrame-records en het tweede bestand bevat de tweede DataFrame-record.

Conclusie

Er zijn drie verschillende manieren om het PySpark DataFrame naar JSON te converteren. Eerst bespraken we de to_json() methode die converteert naar JSON door het PySpark DataFrame te converteren naar het Pandas DataFrame met verschillende voorbeelden door rekening te houden met verschillende parameters. Vervolgens hebben we de methode toJSON() gebruikt. Ten slotte hebben we geleerd hoe we de functie write.json() kunnen gebruiken om het PySpark DataFrame naar JSON te schrijven. Met deze functie is toevoegen en overschrijven mogelijk.