Data Querying in Spark SQL

Tri Juhari
7 min readJul 29, 2021

--

Sebagai seorang yang bekerja dibidang data tentunya teknologi Spark SQL sangat penting untuk dipelajari dan dipahami.

Database SQL memiliki sejuta manfaat dan keuntungan, namun memiliki kekurangan misalnya saja tidak mampu menyimpan banyak aplikasi dengan ukuran data yang besar ( big data) sehingga memerlukan tidak hanya satu teknik pemrosesan , sumber data, dan format penyimpanan. Oleh karena itu dari permasalahan diatas diperlukan solusi untuk mengatasinya yaitu dengan mengimplementasikan sistem terdistribusi contohnya saja Hadoop MapReduce, yang memungkinkan seorang data engineer dapat mengatasi beban kerja seperti ini dengan menambahkan overhead yang sangat besar dan memerlukan pemrograman prosedural tingkat rendah saat tahap persiapannya. Spark SQL dalam implementasinya memberikan beberapa kelebihan dan kemudahan yaitu :

  • Memiliki Kekuatan, kecepatan, dan skalabilitas mesin komputasi cluster
  • Kemampuan untuk bekerja dengan banyak format data dan sumber data
  • Mudahnya dalam memahami halamanKekuatan, kecepatan, dan skalabilitas mesin komputasi cluster Kemampuan untuk bekerja dengan banyak format dan sumber data Kesederhanaan antarmuka pemrograman deklaratif

Skalabilitas Pada Spark

Tentunya teknologi big data tidak akan cukup jika diproses hanya di satu mesin komputer saja ( Single Machine). Teknologi spark menggunakan cluster virtual machine untuk mengatasi volume data yang sangat besar dan komputasi yang sangat besar. Cluster virtual machine ini bekerja secara paralel yang artinya akan ada banyak cluster cluster yang bekerja secara beriringan. sehingga lebih banyak daya komputasi semudah menambahkan lebih banyak mesin. Proses ini dapat diotomatisasi.

Fleksibilitas pada Spark

Spark SQL dirancang untuk menyelesaikan masalah yang terkait dengan ketidakfleksibelan skema dalam database SQL.Spark SQL dapat dengan mudah mendukung sumber data yang biasa digunakan dalam big data, termasuk data dalam bentuk semi terstruktur dan database terdistribusi.

Query Syntax Pada Spark SQL

Banyak keuntungan ketika menggunakan Spark SQL yang merupakan bagian dari proses mesin komputasi. Maksudnya sintaks kueri akan tetap sama, namun kueri akan menjadi lebih cepat karena Spark SQL bekerja secara optimum.

Latihan Dasar Menggunakan Spark SQL

Sample data yang digunakan dapat diunduh disini. Pada bagian ini kita akan belajar bagaimana melakukan query dasar pada Spark SQL.

Langkah 1 : Import Library yang dibutuhkan

Untuk dapat menjalankan Spark SQL diperlukan beberapa library yang dibutuhkan , dengan catatan harus sudah terinstall apache Spark di local computer masing masing.

from pyspark.sql  import SparkSession

Langkah 2 : Mengkoneksikan dengan Apache Spark

Untuk menjalankan dengan Apache Spark dibutuhkan pemanggilan fungsi SparkSession. Tahap ini merupakan tahap yang paling penting karena SparkSession memungkinkan aplikasi Apache Spark untuk dapat mengakses cluster dengan bantuan dari Cluster Manager.

spark = SparkSession.builder().master("local[*]")

Langkah 2 : Import file people.csv yang sudah diunduh

Setelah terhubung dengan Apache Spark langkah selanjutnya kita dapat melakukan import file people.csv dengan kode di bawah ini.

Temporary view ini disebut tabel sementara yang kegunaannya sebagai salinan duplikat data yang dikembalikan oleh subquery yang disimpan namun tidak disimpan di database.

# Create temporary view  similar with tablesspark.sql("""CREATE TEMPORARY VIEW people
USING csv
OPTIONS (
path 'people.csv',
header true
)
""")"""
for drop temporary exist
spark.catalog.dropTempView("people")
"""

Langkah 3 : Menampilkan Deskripsi dari kumpulan data di file csv.

Untuk menampilkan deskripsi dari tabel people dapat menggunakan query seperti dibawah.

spark.sql("""

DESCRIBE people
""").show()

Langkah 4 : Running Simple Query

Menjalankan simple Query misalnya :

“Saya ingin melihat siapa saja yang memiliki tanggal lahir di atas tahun 1960 dan dia itu seorang perempuan”. Maka Querynya seperti dibawah ini.Catatan tambahan fungsi year( ) pada SQL gunanya untuk melakukan ekstrak tanggal lahir dengan hanya mengambil angka tahunnya saja.

spark.sql("""

SELECT firstName, middleName, lastName, birthdate
FROM people
WHERE year(birthdate) > 1960 AND gender = 'F'
ORDER BY firstName
""").show()

Langkah 5: Running Query yang kompleks

Kemudian dilanjut dengan membuat query yang lumayan kompleks misalnya :

“Saya ingin melihat ada berapa orang yang mempunya nama depannya Aletha atau Laila dengan jenis kelamin seorang perempuan kemudian lahir di atas tahun 1960.Kolom kolom yang harus ditampilkan yaitu kolom tahun lahirnya, nama depannya (Aletha atau Laila), dan jumlah orangnya”.

Maka query yang bisa kita tulis sepeti dibawah ini.

spark.sql("""

SELECT year(birthDate) as birthYear, firstName, count (*) AS total
FROM people
WHERE (firstName = 'Aletha' OR firstName = 'Laila') AND gender = 'F'
AND year(birthDate) > 1960
GROUP BY birthYear, firstName
ORDER BY birthYear, firstName
""").show()

Latihan Menggunakan Joins dan Membuat Temporary Views pada Spark SQL.

Sample data yang digunakan pada latihan ini dapat diunduh disini. Pada bagian ini kita akan belajar bagaimana melakukan query menggunakan perintah join dan temporary views.

Temporary views digunakan dengan menetapkan nama tabel untuk query yang akan digunakan dengan seolah-olah itu adalah tabel itu sendiri. Tidak seperti tabel, tampilan sementara tidak disimpan di disk dan hanya terlihat oleh user saat ini.

Temporary views ini memberi nama (nama tabel)untuk query dari SQL, tetapi tidak seperti tabel, tampilan ini hanya ada selama sesi Spark. Akibatnya dengan menggunakan fungsi temporary views tidak akan tersimpan sehingga saat kita memulai ulang cluster maka akan hilang.

Langkah 1 : Membuat Temporay View

Membuat temporary view yang berisi data orang orang dengan jenis kelamin wanita yang lahir di atas tahun 1990. Untuk nama temporary view yaitu WomenBornAfter1990. Untuk query yang digunakan seperti dibawah.

spark.sql("""

CREATE OR REPLACE TEMPORARY VIEW WomenBornAfter1990 AS (
SELECT firstName, middleName, lastName, year(birthDate) AS birthYear, salary
FROM people
WHERE year(birthDate) > 1990 AND gender = 'F'
)
""").show()

Langkah 2 : Menampilkan data dari temporary view “WomenBornAfter1990”

Temporary View Seolah olah tabel itu sendiri.

spark.sql("""

SELECT * FROM WomenBornAfter1990
""").show(20)

Langkah 3: Melakukan Agregasi Data

Menggunakan fungsi Spark yang sudah built in atau bawaan kita dapat menggabungkan data dengan berbagai cara. Misalnya ingin menghitung rata-rata semua gaji di tabel people. Secara default, Anda mendapatkan nilai floating point. Untuk membulatkan ke dolar terdekat, kita akan menggunakan fungsi ROUND().

spark.sql("""

SELECT ROUND(AVG(salary)) AS averageSalary FROM people
""").show()

Langkah 6: Menampilkan Data Social Security

Langkah ke enam menampilkan data dari tabel ssa_names.

spark.sql("""

SELECT * FROM ssa_names
""").show(20)

Langkah 7: Melakukan Join Temporary Views

Sekarang kita coba untuk mengkorelasikan data dalam dua dataset menggunakan join SQL. Tabel yang akan di join yaitu tabel people dengan ssa_names untuk mengeliminasi nama-nama yang tidak terwakili dalam data Jaminan Sosial. Dalam real problem, tentunya mungkin menggunakan join seperti ini untuk memfilter data yang buruk.

spark.sql(
"""
CREATE OR REPLACE TEMPORARY VIEW PeopleDistinctNames AS
SELECT DISTINCT firstName
FROM people;

CREATE OR REPLACE TEMPORARY VIEW SSADistinctNames AS
SELECT DISTINCT firstName AS ssaFirstName
FROM ssa_names

SELECT firstName
FROM PeopleDistinctNames
INNER JOIN SSADistinctNames ON firstName = ssaFirstName
""").show(20)

Langkah 8: Melakukan Subquery

spark.sql("""SELECT count(firstName) 
FROM PeopleDistinctNames
WHERE firstName IN (
SELECT ssaFirstName FROM SSADistinctNames
)
""").show()

Latihan Spark SQL advanced functionality

Sample data yang digunakan pada latihan ini dapat diunduh disini. Pada bagian ini kita akan belajar bagaimana melakukan query menggunakan fungsionalitas.

Langkah 1 : Query Hierarchical Data

Format file JSON umumnya di gunakan untuk data dengan volume besar. Selain itu format JSON mampu menyimpan data yang memerlukan skema fleksibel dan bersarang. Nama Tabel yang digunakan yaitu databricks_blog. Tabel databricks_blog setiap barisnya mewakili entri blog di blog Databricks, dan tabel berisi semua entri blog hingga 9 Agustus 2017.Berikut perintah query untuk menampilkan metadata pada tabel databricks_blog

spark.sql("""
DESCRIBE databricks_blog
""").show(20)

Langkah 2 : Menggunakan Dot Notasi

Bisa kita lihat bahwa ada beberapa kolom dalam tabel yang berisi data bersarang, khususnya penulis, kategori, dan tanggal. Kita akan mulai dengan menggunakan notasi titik untuk mengakses dan memanipulasi sub-data yang ditampilkan.

spark.sql("""
SELECT title,
CAST(dates.publishedOn AS timestamp) AS publishedOn
FROM databricks_blog
""").show(5, truncate=False, vertical=True)

Langkah 3 : Menggunakan higher order functions — TRANSFORM

Higher order functions digunakan untuk memanipulasi data bersarang. Biasanya kita melakukan manipulasi data bersarang dengan membongkar array ke dalam row. Dengan menerapkan fungsi transformasi, dan kemudian mengumpulkan kembali nilai ke dalam array. proses tersebut dianggap tidak efisien, dan rawan kesalahan. Oleh karena itu high order function TRANSFORM memungkinkan kita untuk mengubah semua elemen dari array yang diberikan hanya dalam satu langkah.

spark.sql("""
SELECT authors , categories,
TRANSFORM (categories, category -> LOWER(category)) AS lwr_categories
FROM databricks_blog
""").show(5, truncate=False, vertical=True)

Langkah 4: Menggunakan higher order functions — FILTER

Fungsi FILTER untuk melihat bagaimana kita bisa menarik nilai bersarang tertentu dari sebuah array.

park.sql("""
SELECT title,
FILTER (categories, category -> category = "Apache Spark") filtered
FROM databricks_blog
""").show( truncate=False)

Langkah 7: Menggunakan higher order functions — EXISTS

Fungsi exists mirip dengan filter, kecuali jika nilai spesifik yang ditentukan keluar dari array, ini mengembalikan true jika elemen ada dalam array.

spark.sql("""
SELECT title,
EXISTS (authors, author -> author = "Reynold Xin" OR author = "Ion Stoica") selected
FROM databricks_blog
""").show( truncate=False)

Catatan :

Menerapkan high order function pada data bersarang dapat membantu kita menghemat waktu dan menghindari kesalahan.

--

--

No responses yet