Kino-convert ang PySpark DataFrame sa JSON

Kino Convert Ang Pyspark Dataframe Sa Json



Ang pagpapadala ng structured data gamit ang JSON ay posible at nakakakonsumo din ng mababang memory. Kung ihahambing sa PySpark RDD o PySpark DataFrame, ang JSON ay gumagamit ng mababang memory at serialization na posible sa JSON. Nagagawa naming i-convert ang PySpark DataFrame sa JSON gamit ang pyspark.sql.DataFrameWriter.json() na pamamaraan. Bukod dito, may dalawa pang paraan ng pag-convert ng DataFrame sa JSON.

Paksa ng Nilalaman:

Isaalang-alang natin ang isang simpleng PySpark DataFrame sa lahat ng mga halimbawa at i-convert ito sa JSON gamit ang mga nabanggit na function.







Kinakailangang Module:

I-install ang library ng PySpark sa iyong kapaligiran kung hindi pa ito naka-install. Maaari kang sumangguni sa sumusunod na utos upang mai-install ito:



pip install pyspark

PySpark DataFrame sa JSON Gamit ang To_json() kasama ang ToPandas()

Ang to_json() method ay available sa Pandas module na nagko-convert sa Pandas DataFrame sa JSON. Magagamit namin ang paraang ito kung iko-convert namin ang aming PySpark DataFrame sa Pandas DataFrame. Upang ma-convert ang PySpark DataFrame sa Pandas DataFrame, ginagamit ang toPandas() method. Tingnan natin ang syntax ng to_json() kasama ang mga parameter nito.



Syntax:





dataframe_object.toPandas().to_json(orient,index,...)
  1. Ginagamit ang Orient upang ipakita ang na-convert na JSON bilang gustong format. Nangangailangan ito ng 'mga talaan', 'talahanayan', 'mga halaga', 'mga hanay', 'index', 'hati'.
  2. Ginagamit ang index upang isama/alisin ang index mula sa na-convert na string ng JSON. Kung ito ay nakatakda sa 'True', ang mga indeks ay ipinapakita. Kung hindi, hindi ipapakita ang mga indeks kung ang orient ay 'split' o 'table'.

Halimbawa 1: Orient bilang 'Mga Tala'

Gumawa ng 'skills_df' PySpark DataFrame na may 3 row at 4 na column. I-convert ang DataFrame na ito sa JSON sa pamamagitan ng pagtukoy sa orient parameter bilang 'mga tala'.

import pyspark

mag-import ng mga panda

mula sa pyspark.sql import SparkSession

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

# data ng kasanayan na may 3 row at 4 na column

kasanayan =[{ 'id' : 123 , 'tao' : 'Honey' , 'kasanayan' : 'pagpipinta' , 'premyo' : 25000 },

{ 'id' : 112 , 'tao' : 'Mouni' , 'kasanayan' : 'sayaw' , 'premyo' : 2000 },

{ 'id' : 153 , 'tao' : 'Tulasi' , 'kasanayan' : 'pagbabasa' , 'premyo' : 1200 }

]

# lumikha ng dataframe ng mga kasanayan mula sa data sa itaas

skills_df = linuxhint_spark_app.createDataFrame(skills)

# Aktwal na data ng kasanayan

skills_df.show()

# I-convert sa JSON gamit ang to_json() na may orient bilang 'record'

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

print(json_skills_data)

Output:



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

| id|tao|premyo| kasanayan|

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

| 123 | Honey| 25000 |pintura|

| 112 | Mouni| 2000 | sayaw|

| 153 |Tulasi| 1200 | pagbabasa|

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

[{ 'id' : 123 , 'tao' : 'Honey' , 'premyo' : 25000 , 'kasanayan' : 'pagpipinta' },{ 'id' : 112 , 'tao' : 'Mouni' , 'premyo' : 2000 , 'kasanayan' : 'sayaw' },{ 'id' : 153 , 'tao' : 'Tulasi' , 'premyo' : 1200 , 'kasanayan' : 'nagbabasa' }]

Makikita natin na ang PySpark DataFrame ay na-convert sa JSON array na may diksyunaryo ng mga value. Dito, kinakatawan ng mga key ang pangalan ng column at ang value ay kumakatawan sa row/cell value sa PySpark DataFrame.

Halimbawa 2: Orient bilang 'Split'

Kasama sa format ng JSON na ibinalik ng 'split' orient ang mga pangalan ng column na may listahan ng mga column, listahan ng index, at listahan ng data. Ang sumusunod ay ang format ng 'split' orient.

# I-convert sa JSON gamit ang to_json() na may orient bilang 'split'

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

print(json_skills_data)

Output:

{ 'mga hanay' :[ 'id' , 'tao' , 'premyo' , 'kasanayan' ], 'index' :[ 0 , 1 , 2 ], 'data' :[[ 123 , 'Honey' , 25000 , 'pagpipinta' ],[ 112 , 'Mouni' , 2000 , 'sayaw' ],[ 153 , 'Tulasi' , 1200 , 'nagbabasa' ]]}

Halimbawa 3: Orient bilang 'Index'

Dito, ang bawat hilera mula sa PySpark DataFrame ay inihinto sa anyo ng isang diksyunaryo na may susi bilang pangalan ng column. Para sa bawat diksyunaryo, ang posisyon ng index ay tinukoy bilang isang susi.

# I-convert sa JSON gamit ang to_json() na may orient bilang 'index'

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

print(json_skills_data)

Output:

{ '0' :{ 'id' : 123 , 'tao' : 'Honey' , 'premyo' : 25000 , 'kasanayan' : 'pagpipinta' }, '1' :{ 'id' : 112 , 'tao' : 'Mouni' , 'premyo' : 2000 , 'kasanayan' : 'sayaw' }, '2' :{ 'id' : 153 , 'tao' : 'Tulasi' , 'premyo' : 1200 , 'kasanayan' : 'nagbabasa' }}

Halimbawa 4: Orient bilang 'Mga Column'

Ang mga hanay ay ang susi para sa bawat tala. Ang bawat column ay may hawak na diksyunaryo na kumukuha ng mga value ng column na may mga index na numero.

# I-convert sa JSON gamit ang to_json() na may orient bilang 'columns'

json_skills_data = skills_df.toPandas().to_json(orient= 'mga hanay' )

print(json_skills_data)

Output:

{ 'id' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'tao' :{ '0' : 'Honey' , '1' : 'Mouni' , '2' : 'Tulasi' }, 'premyo' :{ '0' : 25000 , '1' : 2000 , '2' : 1200 }, 'kasanayan' :{ '0' : 'pagpipinta' , '1' : 'sayaw' , '2' : 'nagbabasa' }}

Halimbawa 5: Orient bilang 'Mga Halaga'

Kung kailangan mo lang ng mga value sa JSON, maaari kang pumunta para sa 'values' orient. Ipinapakita nito ang bawat hilera sa isang listahan. Sa wakas, ang lahat ng mga listahan ay naka-imbak sa isang listahan. Ang JSON na ito ay nasa nested na uri ng listahan.

# I-convert sa JSON gamit ang to_json() na may orient bilang 'mga halaga'

json_skills_data = skills_df.toPandas().to_json(orient= 'mga halaga' )

print(json_skills_data)

Output:

[[ 123 , 'Honey' , 25000 , 'pagpipinta' ],[ 112 , 'Mouni' , 2000 , 'sayaw' ],[ 153 , 'Tulasi' , 1200 , 'nagbabasa' ]]

Halimbawa 6: Orient bilang 'Talahanayan'

Ibinabalik ng 'table' orient ang JSON na kinabibilangan ng schema na may mga pangalan ng field kasama ang mga uri ng data ng column, ang index bilang pangunahing key at ang bersyon ng Pandas. Ang mga pangalan ng column na may mga value ay ipinapakita bilang 'data'.

# I-convert sa JSON gamit ang to_json() na may orient bilang 'table'

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

print(json_skills_data)

Output:

{ 'schema' :{ 'mga patlang' :[{ 'pangalan' : 'index' , 'uri' : 'integer' },{ 'pangalan' : 'id' , 'uri' : 'integer' },{ 'pangalan' : 'tao' , 'uri' : 'kuwerdas' },{ 'pangalan' : 'premyo' , 'uri' : 'integer' },{ 'pangalan' : 'kasanayan' , 'uri' : 'kuwerdas' }], 'pangunahing susi' :[ 'index' ], 'pandas_version' : '1.4.0' }, 'data' :[{ 'index' : 0 , 'id' : 123 , 'tao' : 'Honey' , 'premyo' : 25000 , 'kasanayan' : 'pagpipinta' },{ 'index' : 1 , 'id' : 112 , 'tao' : 'Mouni' , 'premyo' : 2000 , 'kasanayan' : 'sayaw' },{ 'index' : 2 , 'id' : 153 , 'tao' : 'Tulasi' , 'premyo' : 1200 , 'kasanayan' : 'nagbabasa' }]}

Halimbawa 7: May Index Parameter

Una, ipinapasa namin ang parameter ng index sa pamamagitan ng pagtatakda nito sa 'True'. Makikita mo para sa bawat halaga ng column na ang posisyon ng index ay ibinalik bilang isang susi sa isang diksyunaryo.

Sa pangalawang output, tanging ang mga pangalan ng column ('column') at records ('data') ang ibinabalik nang walang mga posisyon sa index dahil nakatakda ang index sa 'False'.

# I-convert sa JSON gamit ang to_json() na may index=True

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

print(json_skills_data, ' \n ' )

# I-convert sa JSON gamit ang to_json() na may index=False

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

print(json_skills_data)

Output:

{ 'id' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'tao' :{ '0' : 'Honey' , '1' : 'Mouni' , '2' : 'Tulasi' }, 'premyo' :{ '0' : 25000 , '1' : 2000 , '2' : 1200 }, 'kasanayan' :{ '0' : 'pagpipinta' , '1' : 'sayaw' , '2' : 'nagbabasa' }}

{ 'mga hanay' :[ 'id' , 'tao' , 'premyo' , 'kasanayan' ], 'data' :[[ 123 , 'Honey' , 25000 , 'pagpipinta' ],[ 112 , 'Mouni' , 2000 , 'sayaw' ],[ 153 , 'Tulasi' , 1200 , 'nagbabasa' ]]

PySpark DataFrame sa JSON Gamit ang ToJSON()

Ang toJSON() method ay ginagamit para i-convert ang PySpark DataFrame sa isang JSON object. Karaniwan, nagbabalik ito ng isang string ng JSON na napapalibutan ng isang listahan. Ang [‘{column:value,…}’,…. ] ay ang format na ibinalik ng function na ito. Dito, ibinabalik ang bawat hilera mula sa PySpark DataFrame bilang isang diksyunaryo na may pangalan ng column bilang susi.

Syntax:

dataframe_object.toJSON()

Posibleng ipasa ang mga parameter tulad ng index, mga label ng column, at uri ng data.

Halimbawa:

Gumawa ng 'skills_df' PySpark DataFrame na may 5 row at 4 na column. I-convert ang DataFrame na ito sa JSON gamit ang toJSON() method.

import pyspark

mula sa pyspark.sql import SparkSession

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

# data ng kasanayan na may 5 row at 4 na column

kasanayan =[{ 'id' : 123 , 'tao' : 'Honey' , 'kasanayan' : 'pagpipinta' , 'premyo' : 25000 },

{ 'id' : 112 , 'tao' : 'Mouni' , 'kasanayan' : 'musika/sayaw' , 'premyo' : 2000 },

{ 'id' : 153 , 'tao' : 'Tulasi' , 'kasanayan' : 'pagbabasa' , 'premyo' : 1200 },

{ 'id' : 173 , 'tao' : 'Tumakbo' , 'kasanayan' : 'musika' , 'premyo' : 2000 },

{ 'id' : 43 , 'tao' : 'Kamala' , 'kasanayan' : 'pagbabasa' , 'premyo' : 10000 }

]

# lumikha ng dataframe ng mga kasanayan mula sa data sa itaas

skills_df = linuxhint_spark_app.createDataFrame(skills)

# Aktwal na data ng kasanayan

skills_df.show()

# I-convert sa JSON array

json_skills_data = skills_df.toJSON().collect()

print(json_skills_data)

Output:

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

| id|tao|premyo| kasanayan|

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

| 123 | Honey| 25000 | pagpipinta|

| 112 | Mouni| 2000 |musika/sayaw|

| 153 |Tulasi| 1200 | pagbabasa|

| 173 | Tumakbo| 2000 | musika|

| 43 |Kamala| 10000 | pagbabasa|

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

[ '{'id':123,'person':'Honey','prize':25000,'skill':'painting'}' , '{'id':112,'person':'Mouni','prize':2000,'skill':'music/dance'}' , '{'id':153,'person':'Tulasi','prize':1200,'skill':'reading'}' , '{'id':173,'person':'Ran','prize':2000,'skill':'music'}' , '{'id':43,'person':'Kamala','prize':10000,'skill':'reading'}' ]

Mayroong 5 row sa PySpark DataFrame. Ang lahat ng 5 row na ito ay ibinalik bilang isang diksyunaryo ng mga string na pinaghihiwalay ng kuwit.

PySpark DataFrame sa JSON Gamit ang Write.json()

Ang write.json() method ay available sa PySpark na nagsusulat/nagse-save ng PySpark DataFrame sa isang JSON file. Kinukuha nito ang pangalan/path ng file bilang isang parameter. Karaniwang, ibinabalik nito ang JSON sa maraming mga file (mga nahati na file). Upang pagsamahin ang lahat ng mga ito sa isang file, maaari naming gamitin ang coalesce() method.

Syntax:

dataframe_object.coalesce( 1 ).write.json('file_name')
  1. Append Mode – dataframe_object.write.mode('append').json('file_name')
  2. Overwrite Mode – dataframe_object.write.mode('overwrite').json('file_name')

Posibleng idagdag/i-overwrite ang kasalukuyang JSON. Gamit ang write.mode(), maaari naming idagdag ang data sa pamamagitan ng pagpasa ng 'idagdag' o i-overwrite ang kasalukuyang data ng JSON sa pamamagitan ng pagpasa ng 'overwrite' sa function na ito.

Halimbawa 1:

Gumawa ng 'skills_df' PySpark DataFrame na may 3 row at 4 na column. Isulat ang DataFrame na ito sa JSON.

import pyspark

mag-import ng mga panda

mula sa pyspark.sql import SparkSession

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

# data ng kasanayan na may 3 row at 4 na column

kasanayan =[{ 'id' : 123 , 'tao' : 'Honey' , 'kasanayan' : 'pagpipinta' , 'premyo' : 25000 },

{ 'id' : 112 , 'tao' : 'Mouni' , 'kasanayan' : 'sayaw' , 'premyo' : 2000 },

{ 'id' : 153 , 'tao' : 'Tulasi' , 'kasanayan' : 'pagbabasa' , 'premyo' : 1200 }

]

# lumikha ng dataframe ng mga kasanayan mula sa data sa itaas

skills_df = linuxhint_spark_app.createDataFrame(skills)

# write.json()

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

JSON File:

Makikita natin na kasama sa folder ng skills_data ang naka-partition na data ng JSON.

Buksan natin ang JSON file. Makikita natin na ang lahat ng row mula sa PySpark DataFrame ay na-convert sa JSON.

Mayroong 5 row sa PySpark DataFrame. Ang lahat ng 5 row na ito ay ibinalik bilang isang diksyunaryo ng mga string na pinaghihiwalay ng kuwit.

Halimbawa 2:

Gumawa ng 'skills2_df' PySpark DataFrame na may isang row. Magdagdag ng isang row sa nakaraang JSON file sa pamamagitan ng pagtukoy sa mode bilang 'idagdag.'

import pyspark

mag-import ng mga panda

mula sa pyspark.sql import SparkSession

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

kasanayan2 =[{ 'id' : 78 , 'tao' : 'Maria' , 'kasanayan' : 'nakasakay' , 'premyo' : 8960 }

]

# lumikha ng dataframe ng mga kasanayan mula sa data sa itaas

skills2_df = linuxhint_spark_app.createDataFrame(skills2)

# write.json() na may append mode.

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

JSON File:

Nakikita natin ang mga naka-partition na JSON file. Ang unang file ay nagtataglay ng unang mga tala ng DataFrame at ang pangalawang file ay nagtataglay ng pangalawang tala ng DataFrame.

Konklusyon

Mayroong tatlong magkakaibang paraan upang i-convert ang PySpark DataFrame sa JSON. Una, tinalakay namin ang to_json() method na nagko-convert sa JSON sa pamamagitan ng pag-convert ng PySpark DataFrame sa Pandas DataFrame na may iba't ibang halimbawa sa pamamagitan ng pagsasaalang-alang sa iba't ibang parameter. Susunod, ginamit namin ang toJSON() na paraan. Panghuli, natutunan namin kung paano gamitin ang write.json() function para isulat ang PySpark DataFrame sa JSON. Ang pagdaragdag, at pag-overwrit ay posible sa function na ito.