Menukar PySpark DataFrame kepada JSON

Menukar Pyspark Dataframe Kepada Json



Menghantar data berstruktur menggunakan JSON adalah mungkin dan juga menggunakan memori yang rendah. Jika dibandingkan dengan PySpark RDD atau PySpark DataFrame, JSON menggunakan memori yang rendah dan bersiri yang mungkin dengan JSON. Kami dapat menukar PySpark DataFrame kepada JSON menggunakan kaedah pyspark.sql.DataFrameWriter.json(). Selain itu, terdapat dua cara lain untuk menukar DataFrame kepada JSON.

Topik Kandungan:

Mari kita pertimbangkan PySpark DataFrame yang mudah dalam semua contoh dan tukarkannya kepada JSON menggunakan fungsi yang disebutkan.







Modul yang diperlukan:

Pasang perpustakaan PySpark dalam persekitaran anda jika ia belum dipasang. Anda boleh merujuk kepada arahan berikut untuk memasangnya:



pip pasang pyspark

PySpark DataFrame ke JSON Menggunakan To_json() dengan ToPandas()

Kaedah to_json() tersedia dalam modul Pandas yang menukar Pandas DataFrame kepada JSON. Kami boleh menggunakan kaedah ini jika kami menukar PySpark DataFrame kami kepada Pandas DataFrame. Untuk menukar PySpark DataFrame kepada Pandas DataFrame, kaedah toPandas() digunakan. Mari lihat sintaks to_json() bersama dengan parameternya.



Sintaks:





dataframe_object.toPandas().to_json(orient,index,...)
  1. Orient digunakan untuk memaparkan JSON yang ditukar sebagai format yang dikehendaki. Ia memerlukan 'rekod', 'jadual', 'nilai', 'lajur', 'indeks', 'pecah'.
  2. Indeks digunakan untuk memasukkan/mengalih keluar indeks daripada rentetan JSON yang ditukar. Jika ia ditetapkan kepada 'Benar', indeks dipaparkan. Jika tidak, indeks tidak akan dipaparkan jika orientasi adalah 'berpecah' atau 'jadual'.

Contoh 1: Orient sebagai 'Rekod'

Buat “skills_df” PySpark DataFrame dengan 3 baris dan 4 lajur. Tukar DataFrame ini kepada JSON dengan menentukan parameter orientasi sebagai 'rekod'.

import pyspark

import panda

daripada pyspark.sql import SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Petunjuk Linux' ).getOrCreate()

# data kemahiran dengan 3 baris dan 4 lajur

kemahiran =[{ 'ID' : 123 , 'orang' : 'Sayang' , 'kemahiran' : 'lukisan' , 'hadiah' : 25000 },

{ 'ID' : 112 , 'orang' : 'Mouni' , 'kemahiran' : 'menari' , 'hadiah' : 2000 },

{ 'ID' : 153 , 'orang' : 'Tulasi' , 'kemahiran' : 'membaca' , 'hadiah' : 1200 }

]

# cipta kerangka data kemahiran daripada data di atas

kemahiran_df = linuxhint_spark_app.createDataFrame(kemahiran)

# Data kemahiran sebenar

skills_df.show()

# Tukar kepada JSON menggunakan to_json() dengan orient sebagai 'rekod'

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

print(json_skills_data)

Pengeluaran:



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

| id|orang|hadiah| kemahiran|

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

| 123 | Sayang| 25000 |melukis|

| 112 | Mouni| 2000 | tarian|

| 153 |Tulasi| 1200 | membaca|

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

[{ 'ID' : 123 , 'orang' : 'Sayang' , 'hadiah' : 25000 , 'kemahiran' : 'lukisan' },{ 'ID' : 112 , 'orang' : 'Mouni' , 'hadiah' : 2000 , 'kemahiran' : 'menari' },{ 'ID' : 153 , 'orang' : 'Tulasi' , 'hadiah' : 1200 , 'kemahiran' : 'membaca' }]

Kita dapat melihat bahawa PySpark DataFrame ditukar kepada tatasusunan JSON dengan kamus nilai. Di sini, kekunci mewakili nama lajur dan nilai mewakili nilai baris/sel dalam PySpark DataFrame.

Contoh 2: Orient sebagai 'Split'

Format JSON yang dikembalikan oleh orientasi 'split' termasuk nama lajur yang mempunyai senarai lajur, senarai indeks dan senarai data. Berikut ialah format orientasi 'split'.

# Tukar kepada JSON menggunakan to_json() dengan orient sebagai 'split'

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

print(json_skills_data)

Pengeluaran:

{ 'lajur' :[ 'ID' , 'orang' , 'hadiah' , 'kemahiran' ], 'indeks' :[ 0 , 1 , 2 ], 'data' :[[ 123 , 'Sayang' , 25000 , 'lukisan' ],[ 112 , 'Mouni' , 2000 , 'menari' ],[ 153 , 'Tulasi' , 1200 , 'membaca' ]]}

Contoh 3: Orient sebagai 'Indeks'

Di sini, setiap baris daripada PySpark DataFrame dihentikan dalam bentuk kamus dengan kunci sebagai nama lajur. Untuk setiap kamus, kedudukan indeks ditentukan sebagai kunci.

# Tukar kepada JSON menggunakan to_json() dengan orient sebagai 'indeks'

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

print(json_skills_data)

Pengeluaran:

{ '0' :{ 'ID' : 123 , 'orang' : 'Sayang' , 'hadiah' : 25000 , 'kemahiran' : 'lukisan' }, '1' :{ 'ID' : 112 , 'orang' : 'Mouni' , 'hadiah' : 2000 , 'kemahiran' : 'menari' }, '2' :{ 'ID' : 153 , 'orang' : 'Tulasi' , 'hadiah' : 1200 , 'kemahiran' : 'membaca' }}

Contoh 4: Orient sebagai 'Lajur'

Lajur adalah kunci untuk setiap rekod. Setiap lajur memegang kamus yang mengambil nilai lajur dengan nombor indeks.

# Tukar kepada JSON menggunakan to_json() dengan orient sebagai 'lajur'

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

print(json_skills_data)

Pengeluaran:

{ 'ID' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'orang' :{ '0' : 'Sayang' , '1' : 'Mouni' , '2' : 'Tulasi' }, 'hadiah' :{ '0' : 25000 , '1' : 2000 , '2' : 1200 }, 'kemahiran' :{ '0' : 'lukisan' , '1' : 'menari' , '2' : 'membaca' }}

Contoh 5: Orient sebagai 'Nilai'

Jika anda hanya memerlukan nilai dalam JSON, anda boleh menggunakan orientasi 'nilai'. Ia memaparkan setiap baris dalam senarai. Akhirnya, semua senarai disimpan dalam senarai. JSON ini adalah daripada jenis senarai bersarang.

# Tukar kepada JSON menggunakan to_json() dengan orient sebagai 'nilai'

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

print(json_skills_data)

Pengeluaran:

[[ 123 , 'Sayang' , 25000 , 'lukisan' ],[ 112 , 'Mouni' , 2000 , 'menari' ],[ 153 , 'Tulasi' , 1200 , 'membaca' ]]

Contoh 6: Orient sebagai 'Jadual'

Orientasi 'jadual' mengembalikan JSON yang merangkumi skema dengan nama medan bersama-sama jenis data lajur, indeks sebagai kunci utama dan versi Pandas. Nama lajur dengan nilai dipaparkan sebagai 'data'.

# Tukar kepada JSON menggunakan to_json() dengan orient sebagai 'jadual'

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

print(json_skills_data)

Pengeluaran:

{ 'skema' :{ 'padang' :[{ 'nama' : 'indeks' , 'jenis' : 'integer' },{ 'nama' : 'ID' , 'jenis' : 'integer' },{ 'nama' : 'orang' , 'jenis' : 'tali' },{ 'nama' : 'hadiah' , 'jenis' : 'integer' },{ 'nama' : 'kemahiran' , 'jenis' : 'tali' }], 'kunci utama' :[ 'indeks' ], 'versi_pandas' : '1.4.0' }, 'data' :[{ 'indeks' : 0 , 'ID' : 123 , 'orang' : 'Sayang' , 'hadiah' : 25000 , 'kemahiran' : 'lukisan' },{ 'indeks' : 1 , 'ID' : 112 , 'orang' : 'Mouni' , 'hadiah' : 2000 , 'kemahiran' : 'menari' },{ 'indeks' : 2 , 'ID' : 153 , 'orang' : 'Tulasi' , 'hadiah' : 1200 , 'kemahiran' : 'membaca' }]}

Contoh 7: Dengan Parameter Indeks

Pertama, kami lulus parameter indeks dengan menetapkannya kepada 'Benar'. Anda akan melihat untuk setiap nilai lajur bahawa kedudukan indeks dikembalikan sebagai kunci dalam kamus.

Dalam output kedua, hanya nama lajur (“lajur”) dan rekod (“data”) dikembalikan tanpa kedudukan indeks kerana indeks ditetapkan kepada “Salah”.

# Tukar kepada JSON menggunakan to_json() dengan index=True

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

print(data_kemahiran_json, ' \n ' )

# Tukar kepada JSON menggunakan to_json() dengan index=False

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

print(json_skills_data)

Pengeluaran:

{ 'ID' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'orang' :{ '0' : 'Sayang' , '1' : 'Mouni' , '2' : 'Tulasi' }, 'hadiah' :{ '0' : 25000 , '1' : 2000 , '2' : 1200 }, 'kemahiran' :{ '0' : 'lukisan' , '1' : 'menari' , '2' : 'membaca' }}

{ 'lajur' :[ 'ID' , 'orang' , 'hadiah' , 'kemahiran' ], 'data' :[[ 123 , 'Sayang' , 25000 , 'lukisan' ],[ 112 , 'Mouni' , 2000 , 'menari' ],[ 153 , 'Tulasi' , 1200 , 'membaca' ]]

PySpark DataFrame ke JSON Menggunakan ToJSON()

Kaedah toJSON() digunakan untuk menukar PySpark DataFrame kepada objek JSON. Pada asasnya, ia mengembalikan rentetan JSON yang dikelilingi oleh senarai. The [‘{lajur:nilai,…}’,…. ] ialah format yang dikembalikan oleh fungsi ini. Di sini, setiap baris daripada PySpark DataFrame dikembalikan sebagai kamus dengan nama lajur sebagai kunci.

Sintaks:

dataframe_object.toJSON()

Anda boleh menghantar parameter seperti indeks, label lajur dan jenis data.

Contoh:

Buat “skills_df” PySpark DataFrame dengan 5 baris dan 4 lajur. Tukar DataFrame ini kepada JSON menggunakan kaedah toJSON().

import pyspark

daripada pyspark.sql import SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Petunjuk Linux' ).getOrCreate()

# data kemahiran dengan 5 baris dan 4 lajur

kemahiran =[{ 'ID' : 123 , 'orang' : 'Sayang' , 'kemahiran' : 'lukisan' , 'hadiah' : 25000 },

{ 'ID' : 112 , 'orang' : 'Mouni' , 'kemahiran' : 'muzik/tarian' , 'hadiah' : 2000 },

{ 'ID' : 153 , 'orang' : 'Tulasi' , 'kemahiran' : 'membaca' , 'hadiah' : 1200 },

{ 'ID' : 173 , 'orang' : 'Berlari' , 'kemahiran' : 'muzik' , 'hadiah' : 2000 },

{ 'ID' : 43 , 'orang' : 'Kamala' , 'kemahiran' : 'membaca' , 'hadiah' : 10000 }

]

# cipta kerangka data kemahiran daripada data di atas

kemahiran_df = linuxhint_spark_app.createDataFrame(kemahiran)

# Data kemahiran sebenar

skills_df.show()

# Tukar kepada tatasusunan JSON

json_skills_data = skills_df.toJSON().collect()

print(json_skills_data)

Pengeluaran:

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

| id|orang|hadiah| kemahiran|

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

| 123 | Sayang| 25000 | lukisan|

| 112 | Mouni| 2000 |muzik/tarian|

| 153 |Tulasi| 1200 | membaca|

| 173 | Berlari| 2000 | muzik|

| 43 |Kamala| 10000 | membaca|

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

[ '{'id':123,'person':'Sayang','hadiah':25000,'kemahiran':'melukis'}' , '{'id':112,'person':'Mouni','hadiah':2000,'kemahiran':'muzik/tarian'}' , '{'id':153,'person':'Tulasi','hadiah':1200,'kemahiran':'membaca'}' , '{'id':173,'person':'Ran','prize':2000,'skill':'music'}' , '{'id':43,'person':'Kamala','hadiah':10000,'kemahiran':'membaca'}' ]

Terdapat 5 baris dalam PySpark DataFrame. Kesemua 5 baris ini dikembalikan sebagai kamus rentetan yang dipisahkan dengan koma.

PySpark DataFrame ke JSON Menggunakan Write.json()

Kaedah write.json() tersedia dalam PySpark yang menulis/menyimpan PySpark DataFrame ke fail JSON. Ia mengambil nama/laluan fail sebagai parameter. Pada asasnya, ia mengembalikan JSON dalam berbilang fail (fail berpartition). Untuk menggabungkan kesemuanya dalam satu fail, kita boleh menggunakan kaedah coalesce().

Sintaks:

dataframe_object.coalesce( 1 ).write.json('nama_fail')
  1. Tambah Mod - dataframe_object.write.mode('append').json('file_name')
  2. Mod Tulis Ganti – dataframe_object.write.mode('overwrite').json('file_name')

Anda boleh menambahkan/menimpa JSON sedia ada. Menggunakan write.mode(), kita boleh menambahkan data dengan menghantar 'tambah' atau menulis ganti data JSON sedia ada dengan menghantar 'tulis ganti' ke fungsi ini.

Contoh 1:

Buat “skills_df” PySpark DataFrame dengan 3 baris dan 4 lajur. Tulis DataFrame ini ke JSON.

import pyspark

import panda

daripada pyspark.sql import SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Petunjuk Linux' ).getOrCreate()

# data kemahiran dengan 3 baris dan 4 lajur

kemahiran =[{ 'ID' : 123 , 'orang' : 'Sayang' , 'kemahiran' : 'lukisan' , 'hadiah' : 25000 },

{ 'ID' : 112 , 'orang' : 'Mouni' , 'kemahiran' : 'menari' , 'hadiah' : 2000 },

{ 'ID' : 153 , 'orang' : 'Tulasi' , 'kemahiran' : 'membaca' , 'hadiah' : 1200 }

]

# cipta kerangka data kemahiran daripada data di atas

kemahiran_df = linuxhint_spark_app.createDataFrame(kemahiran)

# write.json()

skills_df.coalesce( 1 ).write.json( 'data_kemahiran' )

Fail JSON:

Kita dapat melihat bahawa folder skills_data termasuk data JSON yang dipisahkan.

Mari buka fail JSON. Kita dapat melihat bahawa semua baris daripada PySpark DataFrame ditukar kepada JSON.

Terdapat 5 baris dalam PySpark DataFrame. Kesemua 5 baris ini dikembalikan sebagai kamus rentetan yang dipisahkan dengan koma.

Contoh 2:

Buat 'skills2_df' PySpark DataFrame dengan satu baris. Tambahkan satu baris pada fail JSON sebelumnya dengan menentukan mod sebagai 'tambah'.

import pyspark

import panda

daripada pyspark.sql import SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Petunjuk Linux' ).getOrCreate()

kemahiran2 =[{ 'ID' : 78 , 'orang' : 'Mary' , 'kemahiran' : 'menunggang' , 'hadiah' : 8960 }

]

# cipta kerangka data kemahiran daripada data di atas

kemahiran2_df = linuxhint_spark_app.createDataFrame(kemahiran2)

# write.json() dengan mod tambah.

kemahiran2_df.write.mode( 'tambah' ).json( 'data_kemahiran' )

Fail JSON:

Kita boleh melihat fail JSON yang dipisahkan. Fail pertama memegang rekod DataFrame pertama dan fail kedua memegang rekod DataFrame kedua.

Kesimpulan

Terdapat tiga cara berbeza untuk menukar PySpark DataFrame kepada JSON. Mula-mula, kami membincangkan kaedah to_json() yang menukar kepada JSON dengan menukar PySpark DataFrame kepada Pandas DataFrame dengan contoh yang berbeza dengan mempertimbangkan parameter yang berbeza. Seterusnya, kami menggunakan kaedah toJSON(). Akhir sekali, kami mempelajari cara menggunakan fungsi write.json() untuk menulis PySpark DataFrame kepada JSON. Menambah dan menulis ganti boleh dilakukan dengan fungsi ini.