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