Belajar PySpark - Membaca File JSON

membaca-json

Membaca file JSON dengan mudah merupakan salah satu keunggulan Apache Spark dalam menangani berbagai format data. File berformat JSON (JavaScript Object Notation) adalah format pertukaran data populer yang digunakan untuk menyusun dan menyimpan data terstruktur.

Jika Anda adalah orang pemula yang baru belajar menggunakan PySpark sebagai tools untuk mengolah dan menganalisis data, artikel ini akan mempelajari cara bekerja dengan file JSON di PySpark.

 

Membaca File JSON

Untuk membaca file json ke dalam pyspark DataFrame, kita bisa menggunakan fungsi spark.read.json(namafile), atau menggunakan fungsi general loader  spark.read.format(“json”).load(namafile)

Untuk memuat file JSON berikut ini

{ "name": "Chris", "age": 23, "city": "New York" },
{ "name": "Emily", "age": 19, "city": "Atlanta" },
{ "name": "Joe", "age": 32, "city": "New York" }

 

Jika file JSON tersebut disimpan dalam file bernama people.json, maka kode PySpark akan seperti berikut

df = spark.read.json("people.json")
df.printSchema()
df.show()
root
 |-- age: long (nullable = true)
 |-- city: string (nullable = true)
 |-- name: string (nullable = true)

+---+--------+-----+
|age|    city| name|
+---+--------+-----+
| 23|New York|Chris|
| 19| Atlanta|Emily|
| 32|New York|  Joe|
+---+--------+-----+

 

Kita juga dapat menggunakan general loader seperti berikut ini

df = spark.read.format("json").load("people.json")

 

Membaca Multiline JSON

Secara default, Spark mengasumsikan bahwa format file JSON yang dibaca terdiri dari 1 baris untuk 1 record. Untuk file JSON dengan format multiline seperti berikut ini :

[
  { 
    "name": "Chris", 
    "age": 23, 
    "city": "New York" 
  },
  { 
    "name": "Emily", 
    "age": 19, 
    "city": "Atlanta" 
  },
  { 
    "name": "Joe", 
    "age": 32, 
    "city": "New York" 
  }
]

 

Kita perlu menggunakan parameter multiLine = True

df = spark.read.json("people_multi.json", multiLine=True)
df.printSchema()
df.show()
root
 |-- age: long (nullable = true)
 |-- city: string (nullable = true)
 |-- name: string (nullable = true)


+---+--------+-----+
|age|    city| name|
+---+--------+-----+
| 23|New York|Chris|
| 19| Atlanta|Emily|
| 32|New York|  Joe|
+---+--------+-----+

 

Atau menggunakan general reader seperti berikut ini

df = spark.read.format("json") \
        .options(multiLine=True) \
        .load("people_multi.json")

 

Membaca JSON Dengan SQL Statement

Kita juga dapat menggunakan SQL statement untuk membaca file JSON. Gunakan perintah

CREATE TEMPORARY VIEW nama_view USING json OPTION(path 'lokasi file')

Untuk JSON berformat multiline, tambahkan opsi multiline 'True'

spark.sql("CREATE OR REPLACE TEMPORARY VIEW people" +
          " USING json" +
          " OPTIONS" +
          "   (path 'people_multi.json'," +
          "     multiline 'True')")


spark.sql("select * from people").show()
+---+--------+-----+
|age|    city| name|
+---+--------+-----+
| 23|New York|Chris|
| 19| Atlanta|Emily|
| 32|New York|  Joe|
+---+--------+-----+

 

Urutan Kolom Pada DataFrame Hasil Loading JSON

Secara default kolom pada dataframe hasil pembacaan file JSON akan diurutkan secara alfabetikal. Untuk mengubah struktur kolom dengan urutan tertentu, gunakan fungsi DataFrame.select

df = spark.read.json("people_multi.json", multiLine=True) \
          .select("name", "age", "city")
df.show()
+-----+---+--------+
| name|age|    city|
+-----+---+--------+
|Chris| 23|New York|
|Emily| 19| Atlanta|
|  Joe| 32|New York|
+-----+---+--------+

 

Opsi Pada JSON Reader

Selain opsi multiline, ada beberapa opsi lain yang bisa digunakan pada saat membaca file JSON. Opsi-opsi ini diset melalui beberapa cara, yaitu :

  • Parameter fungsi, jika menggunakan spark.read.json()
  • Parameter fungsi .options() jika menggunakan spark.read.format(“json”)
  • Klausa OPTIONS jika menggunakan CREATE TEMPORARY VIEW USING json

Misalnya untuk file JSON di mana nama field-nya tidak menggunakan quote, seperti berikut ini :

[
  { 
    name: "Chris", 
    age: 30 
  },
  { 
    name: "Emily", 
    age: 19
  }
]

 

Kita perlu menggunakan opsi multiLine=True, dan allowUnquotedFieldNames=True

Jika menggunakan json reader :

df = spark.read.json("people_nonquote.json",
                     multiLine=True,
                     allowUnquotedFieldNames=True)
df.printSchema()
df.show()
root
 |-- age: long (nullable = true)
 |-- name: string (nullable = true)


+---+-----+
|age| name|
+---+-----+
| 30|Chris|
| 19|Emily|
+---+-----+

 

Jika menggunakan general loader :

df = spark.read.format("json") \
                .options(multiLine=True) \
                .options(allowUnquotedFieldNames=True) \
                .load("people_nonquote.json")

 

Atau jika menggunakan CREATE TEMPORARY VIEW

spark.sql("CREATE OR REPLACE TEMPORARY VIEW people" +
          " USING json" +
          " OPTIONS" +
          "   (path 'people_nonquote.json'," +
          "     multiline 'True',"
          "     allowUnquotedFieldNames='True')")


spark.sql("select * from people").show()

 

Selain contoh-contoh di atas, masih banyak parameter atau opsi yang bisa digunakan sesuai dengan kebutuhan. Daftar parameter yang bisa digunakan dapat dilihat di sini

Notebook untuk tutorial ini dapat diakses di sini

 

Artikel sebelumnya