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()
|-- 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()
|-- 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|
+---+--------+-----+
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()
|-- age: long (nullable = true)
|-- name: string (nullable = true)
+---+-----+
|age| name|
+---+-----+
| 30|Chris|
| 19|Emily|
+---+-----+
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
Membaca File csv ke DataFrame
Memproses Dataframe dengan Temporary View dan SQL
Join DataFrame
Dataframe GroupBy dan Agregasi
Select, Filter, dan Where pada DataFrame