การแปลง PySpark DataFrame เป็น JSON

Kar Paelng Pyspark Dataframe Pen Json



การส่งข้อมูลที่มีโครงสร้างโดยใช้ JSON เป็นไปได้และใช้หน่วยความจำน้อย เมื่อเปรียบเทียบกับ PySpark RDD หรือ PySpark DataFrame แล้ว JSON ใช้หน่วยความจำน้อยและการทำให้เป็นอนุกรมซึ่งเป็นไปได้กับ JSON เราสามารถแปลง PySpark DataFrame เป็น JSON โดยใช้วิธี pyspark.sql.DataFrameWriter.json() นอกจากนี้ยังมีอีกสองวิธีในการแปลง DataFrame เป็น JSON

หัวข้อเนื้อหา:

ลองพิจารณา PySpark DataFrame ง่ายๆ ในตัวอย่างทั้งหมดแล้วแปลงเป็น JSON โดยใช้ฟังก์ชันที่กล่าวถึง







โมดูลที่จำเป็น:

ติดตั้งไลบรารี PySpark ในสภาพแวดล้อมของคุณหากยังไม่ได้ติดตั้ง คุณสามารถอ้างถึงคำสั่งต่อไปนี้เพื่อติดตั้ง:



pip ติดตั้ง pyspark

PySpark DataFrame เป็น JSON โดยใช้ To_json() กับ ToPandas()

เมธอด to_json() มีอยู่ในโมดูล Pandas ซึ่งจะแปลง Pandas DataFrame เป็น JSON เราสามารถใช้วิธีนี้ได้หากเราแปลง PySpark DataFrame เป็น Pandas DataFrame ในการแปลง PySpark DataFrame เป็น Pandas DataFrame จะใช้วิธี toPandas() มาดูไวยากรณ์ของ to_json() พร้อมกับพารามิเตอร์



ไวยากรณ์:





dataframe_object.toPandas().to_json(orient,ดัชนี,...)
  1. Orient ใช้เพื่อแสดง JSON ที่แปลงเป็นรูปแบบที่ต้องการ ใช้ 'บันทึก', 'ตาราง', 'ค่า', 'คอลัมน์', 'ดัชนี', 'แยก'
  2. ดัชนีใช้เพื่อรวม/ลบดัชนีออกจากสตริง JSON ที่แปลงแล้ว หากตั้งค่าเป็น 'จริง' ดัชนีจะแสดงขึ้น มิฉะนั้น ดัชนีจะไม่แสดงหากทิศทางเป็น 'แยก' หรือ 'ตาราง'

ตัวอย่างที่ 1: ปรับทิศทางเป็น “บันทึก”

สร้าง “skills_df” PySpark DataFrame ที่มี 3 แถวและ 4 คอลัมน์ แปลง DataFrame นี้เป็น JSON โดยระบุพารามิเตอร์ orient เป็น 'records'

นำเข้า pyspark

นำเข้าแพนด้า

จาก pyspark.sql นำเข้า SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()

# ข้อมูลทักษะที่มี 3 แถวและ 4 คอลัมน์

ทักษะ =[{ 'รหัส' : 123 , 'บุคคล' : 'น้ำผึ้ง' , 'ทักษะ' : 'จิตรกรรม' , 'รางวัล' : 25000 },

{ 'รหัส' : 112 , 'บุคคล' : 'มูนี่' , 'ทักษะ' : 'เต้นรำ' , 'รางวัล' : 2543 },

{ 'รหัส' : 153 , 'บุคคล' : 'ทูลาซี' , 'ทักษะ' : 'การอ่าน' , 'รางวัล' : 1200 }

]

# สร้าง dataframe ทักษะจากข้อมูลด้านบน

Skills_df = linuxhint_spark_app.createDataFrame (ทักษะ)

# ข้อมูลทักษะจริง

ทักษะ_df.แสดง()

# แปลงเป็น JSON โดยใช้ to_json() โดยมี orient เป็น 'บันทึก'

json_skills_data = skills_df.toPandas().to_json(orient= 'บันทึก' )

พิมพ์ (json_skills_data)

เอาท์พุต:



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

| รหัส|บุคคล|รางวัล| ทักษะ|

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

| 123 | น้ำผึ้ง| 25000 |จิตรกรรม|

| 112 | มูนี่| 2543 | เต้นรำ|

| 153 |ทูลาซี| 1200 | กำลังอ่าน|

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

[{ 'รหัส' : 123 , 'บุคคล' : 'น้ำผึ้ง' , 'รางวัล' : 25000 , 'ทักษะ' : 'จิตรกรรม' },{ 'รหัส' : 112 , 'บุคคล' : 'มูนี่' , 'รางวัล' : 2543 , 'ทักษะ' : 'เต้นรำ' },{ 'รหัส' : 153 , 'บุคคล' : 'ทูลาซี' , 'รางวัล' : 1200 , 'ทักษะ' : 'การอ่าน' }]

เราจะเห็นว่า PySpark DataFrame ถูกแปลงเป็นอาร์เรย์ JSON ด้วยพจนานุกรมของค่า ที่นี่ คีย์แสดงถึงชื่อคอลัมน์และค่าแสดงถึงค่าแถว/เซลล์ใน PySpark DataFrame

ตัวอย่างที่ 2: ปรับทิศทางเป็น “แยก”

รูปแบบ JSON ที่ส่งคืนโดย 'แยก' orient รวมถึงชื่อคอลัมน์ซึ่งมีรายการคอลัมน์ รายการดัชนี และรายการข้อมูล ต่อไปนี้เป็นรูปแบบของ 'แยก' orient

# แปลงเป็น JSON โดยใช้ to_json() โดยมี orient เป็น 'split'

json_skills_data = skills_df.toPandas().to_json(orient= 'แยก' )

พิมพ์ (json_skills_data)

เอาท์พุต:

{ 'คอลัมน์' :[ 'รหัส' , 'บุคคล' , 'รางวัล' , 'ทักษะ' ] 'ดัชนี' :[ 0 , 1 , 2 ] 'ข้อมูล' :[[ 123 , 'น้ำผึ้ง' , 25000 , 'จิตรกรรม' ],[ 112 , 'มูนี่' , 2543 , 'เต้นรำ' ],[ 153 , 'ทูลาซี' , 1200 , 'การอ่าน' ]]}

ตัวอย่างที่ 3: ปรับทิศทางเป็น “ดัชนี”

ที่นี่ แต่ละแถวจาก PySpark DataFrame จะถูกยกเลิกในรูปแบบของพจนานุกรมโดยมีคีย์เป็นชื่อคอลัมน์ สำหรับแต่ละพจนานุกรม ตำแหน่งดัชนีจะถูกระบุเป็นคีย์

# แปลงเป็น JSON โดยใช้ to_json() โดยมี orient เป็น 'index'

json_skills_data = skills_df.toPandas().to_json(orient= 'ดัชนี' )

พิมพ์ (json_skills_data)

เอาท์พุต:

{ '0' :{ 'รหัส' : 123 , 'บุคคล' : 'น้ำผึ้ง' , 'รางวัล' : 25000 , 'ทักษะ' : 'จิตรกรรม' }, '1' :{ 'รหัส' : 112 , 'บุคคล' : 'มูนี่' , 'รางวัล' : 2543 , 'ทักษะ' : 'เต้นรำ' }, '2' :{ 'รหัส' : 153 , 'บุคคล' : 'ทูลาซี' , 'รางวัล' : 1200 , 'ทักษะ' : 'การอ่าน' }}

ตัวอย่างที่ 4: วางแนวเป็น “คอลัมน์”

คอลัมน์เป็นกุญแจสำคัญสำหรับแต่ละระเบียน แต่ละคอลัมน์มีพจนานุกรมที่ใช้ค่าคอลัมน์พร้อมหมายเลขดัชนี

# แปลงเป็น JSON โดยใช้ to_json() โดยมี orient เป็น 'คอลัมน์'

json_skills_data = skills_df.toPandas().to_json(orient= 'คอลัมน์' )

พิมพ์ (json_skills_data)

เอาท์พุต:

{ 'รหัส' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'บุคคล' :{ '0' : 'น้ำผึ้ง' , '1' : 'มูนี่' , '2' : 'ทูลาซี' }, 'รางวัล' :{ '0' : 25000 , '1' : 2543 , '2' : 1200 }, 'ทักษะ' :{ '0' : 'จิตรกรรม' , '1' : 'เต้นรำ' , '2' : 'การอ่าน' }}

ตัวอย่างที่ 5: Orient as “Values”

หากคุณต้องการเฉพาะค่าใน JSON คุณสามารถไปที่ 'ค่า' orient จะแสดงแต่ละแถวในรายการ สุดท้าย รายการทั้งหมดจะถูกเก็บไว้ในรายการ JSON นี้เป็นประเภทรายการที่ซ้อนกัน

# แปลงเป็น JSON โดยใช้ to_json() โดยมี orient เป็น 'ค่า'

json_skills_data = skills_df.toPandas().to_json(orient= 'ค่า' )

พิมพ์ (json_skills_data)

เอาท์พุต:

[[ 123 , 'น้ำผึ้ง' , 25000 , 'จิตรกรรม' ],[ 112 , 'มูนี่' , 2543 , 'เต้นรำ' ],[ 153 , 'ทูลาซี' , 1200 , 'การอ่าน' ]]

ตัวอย่างที่ 6: วางแนวเป็น “ตาราง”

orient 'ตาราง' ส่งคืน JSON ที่มีสคีมาพร้อมชื่อฟิลด์พร้อมกับประเภทข้อมูลคอลัมน์ ดัชนีเป็นคีย์หลัก และเวอร์ชัน Pandas ชื่อคอลัมน์ที่มีค่าจะแสดงเป็น 'ข้อมูล'

# แปลงเป็น JSON โดยใช้ to_json() โดยมี orient เป็น 'table'

json_skills_data = skills_df.toPandas().to_json(orient= 'โต๊ะ' )

พิมพ์ (json_skills_data)

เอาท์พุต:

{ 'สคีมา' :{ 'ฟิลด์' :[{ 'ชื่อ' : 'ดัชนี' , 'พิมพ์' : 'จำนวนเต็ม' },{ 'ชื่อ' : 'รหัส' , 'พิมพ์' : 'จำนวนเต็ม' },{ 'ชื่อ' : 'บุคคล' , 'พิมพ์' : 'สตริง' },{ 'ชื่อ' : 'รางวัล' , 'พิมพ์' : 'จำนวนเต็ม' },{ 'ชื่อ' : 'ทักษะ' , 'พิมพ์' : 'สตริง' }], 'คีย์หลัก' :[ 'ดัชนี' ] 'แพนด้า_เวอร์ชั่น' : '1.4.0' }, 'ข้อมูล' :[{ 'ดัชนี' : 0 , 'รหัส' : 123 , 'บุคคล' : 'น้ำผึ้ง' , 'รางวัล' : 25000 , 'ทักษะ' : 'จิตรกรรม' },{ 'ดัชนี' : 1 , 'รหัส' : 112 , 'บุคคล' : 'มูนี่' , 'รางวัล' : 2543 , 'ทักษะ' : 'เต้นรำ' },{ 'ดัชนี' : 2 , 'รหัส' : 153 , 'บุคคล' : 'ทูลาซี' , 'รางวัล' : 1200 , 'ทักษะ' : 'การอ่าน' }]}

ตัวอย่างที่ 7: ด้วยพารามิเตอร์ดัชนี

ขั้นแรก เราส่งพารามิเตอร์ดัชนีโดยตั้งค่าเป็น 'จริง' คุณจะเห็นค่าแต่ละคอลัมน์ที่ตำแหน่งดัชนีถูกส่งกลับเป็นคีย์ในพจนานุกรม

ในเอาต์พุตที่สอง เฉพาะชื่อคอลัมน์ ('คอลัมน์') และระเบียน ('ข้อมูล') เท่านั้นที่จะถูกส่งกลับโดยไม่มีตำแหน่งดัชนี เนื่องจากดัชนีถูกตั้งค่าเป็น 'เท็จ'

# แปลงเป็น JSON โดยใช้ to_json() กับ index=True

json_skills_data = skills_df.toPandas().to_json(ดัชนี=จริง)

พิมพ์ (json_skills_data, ' \n ' )

# แปลงเป็น JSON โดยใช้ to_json() กับ index=False

json_skills_data= skills_df.toPandas().to_json(index=False,orient= 'แยก' )

พิมพ์ (json_skills_data)

เอาท์พุต:

{ 'รหัส' :{ '0' : 123 , '1' : 112 , '2' : 153 }, 'บุคคล' :{ '0' : 'น้ำผึ้ง' , '1' : 'มูนี่' , '2' : 'ทูลาซี' }, 'รางวัล' :{ '0' : 25000 , '1' : 2543 , '2' : 1200 }, 'ทักษะ' :{ '0' : 'จิตรกรรม' , '1' : 'เต้นรำ' , '2' : 'การอ่าน' }}

{ 'คอลัมน์' :[ 'รหัส' , 'บุคคล' , 'รางวัล' , 'ทักษะ' ] 'ข้อมูล' :[[ 123 , 'น้ำผึ้ง' , 25000 , 'จิตรกรรม' ],[ 112 , 'มูนี่' , 2543 , 'เต้นรำ' ],[ 153 , 'ทูลาซี' , 1200 , 'การอ่าน' ]]

PySpark DataFrame เป็น JSON โดยใช้ ToJSON()

เมธอด toJSON() ใช้เพื่อแปลง PySpark DataFrame เป็นวัตถุ JSON โดยพื้นฐานแล้ว จะส่งคืนสตริง JSON ซึ่งล้อมรอบด้วยรายการ เดอะ [‘{คอลัมน์:ค่า,…}’,…. ] เป็นรูปแบบที่ส่งคืนโดยฟังก์ชันนี้ ที่นี่ แต่ละแถวจาก PySpark DataFrame จะถูกส่งกลับเป็นพจนานุกรมโดยมีชื่อคอลัมน์เป็นคีย์

ไวยากรณ์:

dataframe_object.toJSON()

สามารถส่งผ่านพารามิเตอร์ เช่น ดัชนี ป้ายชื่อคอลัมน์ และประเภทข้อมูลได้

ตัวอย่าง:

สร้าง “skills_df” PySpark DataFrame ที่มี 5 แถวและ 4 คอลัมน์ แปลง DataFrame นี้เป็น JSON โดยใช้วิธี toJSON()

นำเข้า pyspark

จาก pyspark.sql นำเข้า SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()

# ข้อมูลทักษะที่มี 5 แถวและ 4 คอลัมน์

ทักษะ =[{ 'รหัส' : 123 , 'บุคคล' : 'น้ำผึ้ง' , 'ทักษะ' : 'จิตรกรรม' , 'รางวัล' : 25000 },

{ 'รหัส' : 112 , 'บุคคล' : 'มูนี่' , 'ทักษะ' : 'ดนตรี/เต้นรำ' , 'รางวัล' : 2543 },

{ 'รหัส' : 153 , 'บุคคล' : 'ทูลาซี' , 'ทักษะ' : 'การอ่าน' , 'รางวัล' : 1200 },

{ 'รหัส' : 173 , 'บุคคล' : 'รัน' , 'ทักษะ' : 'ดนตรี' , 'รางวัล' : 2543 },

{ 'รหัส' : 43 , 'บุคคล' : 'กมลา' , 'ทักษะ' : 'การอ่าน' , 'รางวัล' : 10,000 }

]

# สร้าง dataframe ทักษะจากข้อมูลด้านบน

Skills_df = linuxhint_spark_app.createDataFrame (ทักษะ)

# ข้อมูลทักษะจริง

ทักษะ_df.แสดง()

# แปลงเป็นอาร์เรย์ JSON

json_skills_data = skills_df.toJSON().collect()

พิมพ์ (json_skills_data)

เอาท์พุต:

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

| รหัส|บุคคล|รางวัล| ทักษะ|

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

| 123 | น้ำผึ้ง| 25000 | จิตรกรรม|

| 112 | มูนี่| 2543 |ดนตรี/เต้นรำ|

| 153 |ทูลาซี| 1200 | กำลังอ่าน|

| 173 | วิ่ง| 2543 | ดนตรี|

| 43 |กมลา| 10,000 | กำลังอ่าน|

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

[ '{'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':'กมลา','prize':10000,'skill':'reading'}' ]

มี 5 แถวใน PySpark DataFrame แถวทั้ง 5 นี้จะถูกส่งกลับเป็นพจนานุกรมของสตริงซึ่งคั่นด้วยเครื่องหมายจุลภาค

PySpark DataFrame เป็น JSON โดยใช้ Write.json()

เมธอด write.json() มีอยู่ใน PySpark ซึ่งเขียน/บันทึก PySpark DataFrame ลงในไฟล์ JSON ใช้ชื่อไฟล์/พาธเป็นพารามิเตอร์ โดยพื้นฐานแล้ว จะส่งคืน JSON ในหลายไฟล์ (ไฟล์ที่แบ่งพาร์ติชัน) ในการรวมทั้งหมดไว้ในไฟล์เดียว เราสามารถใช้เมธอด coalesce()

ไวยากรณ์:

dataframe_object.coalesce( 1 ).write.json('file_name')
  1. ต่อท้ายโหมด – dataframe_object.write.mode('ผนวก').json('file_name')
  2. โหมดเขียนทับ – dataframe_object.write.mode('เขียนทับ').json('file_name')

สามารถผนวก/เขียนทับ JSON ที่มีอยู่ได้ เมื่อใช้ write.mode() เราสามารถผนวกข้อมูลโดยผ่าน 'ผนวก' หรือเขียนทับข้อมูล JSON ที่มีอยู่โดยส่ง 'เขียนทับ' ไปยังฟังก์ชันนี้

ตัวอย่างที่ 1:

สร้าง “skills_df” PySpark DataFrame ที่มี 3 แถวและ 4 คอลัมน์ เขียน DataFrame นี้ไปยัง JSON

นำเข้า pyspark

นำเข้าแพนด้า

จาก pyspark.sql นำเข้า SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()

# ข้อมูลทักษะที่มี 3 แถวและ 4 คอลัมน์

ทักษะ =[{ 'รหัส' : 123 , 'บุคคล' : 'น้ำผึ้ง' , 'ทักษะ' : 'จิตรกรรม' , 'รางวัล' : 25000 },

{ 'รหัส' : 112 , 'บุคคล' : 'มูนี่' , 'ทักษะ' : 'เต้นรำ' , 'รางวัล' : 2543 },

{ 'รหัส' : 153 , 'บุคคล' : 'ทูลาซี' , 'ทักษะ' : 'การอ่าน' , 'รางวัล' : 1200 }

]

# สร้าง dataframe ทักษะจากข้อมูลด้านบน

Skills_df = linuxhint_spark_app.createDataFrame (ทักษะ)

#write.json()

Skills_df.coalesce( 1 ).write.json( 'ข้อมูลทักษะ' )

ไฟล์ JSON:

เราจะเห็นว่าโฟลเดอร์ Skills_data มีข้อมูล JSON ที่แบ่งพาร์ติชันแล้ว

มาเปิดไฟล์ JSON กัน เราจะเห็นว่าแถวทั้งหมดจาก PySpark DataFrame ถูกแปลงเป็น JSON

มี 5 แถวใน PySpark DataFrame แถวทั้ง 5 นี้จะถูกส่งกลับเป็นพจนานุกรมของสตริงซึ่งคั่นด้วยเครื่องหมายจุลภาค

ตัวอย่างที่ 2:

สร้าง “skills2_df” PySpark DataFrame ด้วยหนึ่งแถว ต่อท้ายหนึ่งแถวต่อไฟล์ JSON ก่อนหน้าโดยระบุโหมดเป็น 'ต่อท้าย'

นำเข้า pyspark

นำเข้าแพนด้า

จาก pyspark.sql นำเข้า SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()

ทักษะ2 =[{ 'รหัส' : 78 , 'บุคคล' : 'แมรี่' , 'ทักษะ' : 'ขี่' , 'รางวัล' : 8960 }

]

# สร้าง dataframe ทักษะจากข้อมูลด้านบน

ทักษะ 2_df = linuxhint_spark_app.createDataFrame (ทักษะ 2)

# write.json() พร้อมโหมดต่อท้าย

ทักษะ2_df.write.mode( 'ผนวก' ).json( 'ข้อมูลทักษะ' )

ไฟล์ JSON:

เราสามารถเห็นไฟล์ JSON ที่แบ่งพาร์ติชัน ไฟล์แรกเก็บบันทึก DataFrame แรก และไฟล์ที่สองเก็บบันทึก DataFrame ที่สอง

บทสรุป

มีสามวิธีในการแปลง PySpark DataFrame เป็น JSON ขั้นแรก เราได้กล่าวถึงเมธอด to_json() ซึ่งแปลงเป็น JSON โดยการแปลง PySpark DataFrame เป็น Pandas DataFrame ด้วยตัวอย่างต่างๆ โดยพิจารณาจากพารามิเตอร์ต่างๆ ต่อไปเราใช้เมธอด toJSON() สุดท้าย เราได้เรียนรู้วิธีใช้ฟังก์ชัน write.json() เพื่อเขียน PySpark DataFrame ไปยัง JSON การต่อท้ายและการเขียนทับเป็นไปได้ด้วยฟังก์ชันนี้