<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Zidane Arrizqi Akmal on Medium]]></title>
        <description><![CDATA[Stories by Zidane Arrizqi Akmal on Medium]]></description>
        <link>https://medium.com/@Akmal_Zidan?source=rss-d99b42184d0a------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*NoUlIB0PYWklnBVQ</url>
            <title>Stories by Zidane Arrizqi Akmal on Medium</title>
            <link>https://medium.com/@Akmal_Zidan?source=rss-d99b42184d0a------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 12 Nov 2026 04:09:32 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@Akmal_Zidan/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[What does interface mean in PBO]]></title>
            <link>https://medium.com/@Akmal_Zidan/what-does-interface-mean-in-pbo-0d402ec32e73?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/0d402ec32e73</guid>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Mon, 09 Nov 2026 04:52:59 GMT</pubDate>
            <atom:updated>2026-11-09T04:52:59.613Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ouJo4ulipLH__v87" /><figcaption>Photo by <a href="https://unsplash.com/@unidentifieduser?utm_source=medium&amp;utm_medium=referral">nameless 3791</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>What?</h3><p>Interface simpelnya hanya merupakan daftar method yang wajib dimiliki oleh sebuah class. Umumnya, method yang ada pada interface tidak diisi atau kosong.</p><h4>For what?</h4><p>Secara pengertian, Interface dinilai merupakan fungsi yang tidak terlalu penting jika dibayangkan. Namun pada penerapannya, interface dinilai penting dan sangat berguna.</p><ul><li>Interface dapat menjadi kamus standar atau bisa dikatakan sebagai standarisasi bagi sebuah program yang dibuat bersama. Sebagai contoh, dalam skenario pembuatan suatu program, fungsi yang sama dapat ditulis dalam berbagai variabel (misalnya : nama() , name()) hal ini membuat programmer lain kebingungan karena terdapat variabel yang berbeda-beda padahal fungsinya sama. Dengan interface, seluruh programmer dipaksa menggunakan variabel yang sama</li><li>Interface dapat berfungsi sebagai <em>Loose Coupling </em>yang artinya menurunkan keterikatan pada 1 class. Pada suatu skenario, jika suatu fitur terikat pada class tertentu, code umumnya akan sulit dikembangkan. Contohnya pada sistem Toko Online</li></ul><pre>class TokoOnline {<br>    private firstWorldBank pembayaran;<br>}</pre><p>Pada kode tersebut, pembayaran jadi terikat pada firstWorldBank. Jika suatu saat toko tersebut ingin menambah metode pembayaran, maka code harus dibongkar semua. Interface hadir dengan membuat sistem standar pembayaran yaitu proses bayar. Proses bayar ini dapat berubah menjadi metode pembayaran yang dipilih</p><pre>interface MetodePembayaran {<br>    void prosesBayar();<br>}<br><br>class TokoOnline {<br>    private MetodePembayaran pembayaran;<br>}</pre><h3>How?</h3><p>Sebagai contoh untuk mengimplementasikan interface contohnya seperti ini :</p><pre>interface OperasiHitung {<br>    int hitung(int a, int b); <br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/243/1*tX3wKmkIl6WBIkmLyqAo2g.png" /></figure><p>Setelah membuat interface, langkah selanjutnya adalah menerapkan inheritance ke interface. Sebagai contoh kira-kira seperti ini :</p><pre>class Penjumlahan implements OperasiHitung {<br>    @Override <br>    public int hitung(int a, int b) { <br>        return a + b; <br>    } <br>}<br><br>class Pengurangan implements OperasiHitung {<br>    @Override <br>    public int hitung(int a, int b) { <br>        return a - b; <br>    } <br>}<br><br>public class PraktikumPBO_10 { <br>    public static void main(String[] args) {<br>        <br>        OperasiHitung penjumlahan = new Penjumlahan(); <br>        System.out.println(&quot;Penjumlahan: &quot; + penjumlahan.hitung(10, 5)); <br>        <br>        OperasiHitung pengurangan = new Pengurangan(); <br>        System.out.println(&quot;Pengurangan: &quot; + pengurangan.hitung(10, 5)); <br>    } <br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/594/1*rvaIhZHDyeX46ukJA77eig.png" /></figure><p>Setelah mencoba cara simpel interface, hal yang dapat dicoba selanjutnya adalah mengerjakan soal dan subsoalnya, untuk soalnya kira-kira seperti ini</p><p>“Anda diminta untuk membuat program sistem pembayaran untuk sebuah toko yang menjual dua jenis produk: Elektronik dan Makanan. Setiap produk memiliki metode untuk menghitung pajak, di mana Elektronik dikenakan pajak sebesar 10% dan Makanan sebesar 5%.” Lalu untuk subsoalnya kira-kira seperti ini :</p><ul><li>Buat interface Pembayaran dengan metode hitungPajak(double harga). Sebagai contoh jawabannya kira-kira seperti ini :</li></ul><pre>interface Pembayaran {<br>    double hitungPajak(double harga);<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/305/1*sNQzzPRRjnqCpw2AgkPpjw.png" /></figure><ul><li>Buat kelas Elektronik yang mengimplementasikan interface Pembayaran dan mengisi metode hitungPajak() untuk menghitung pajak sebesar 10% dari harga. Sebagai contoh jawabannya kira-kira seperti ini :</li></ul><pre>class Elektronik implements Pembayaran {<br>    @Override<br>    public double hitungPajak(double harga){<br>        return harga * 0.1;<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/358/1*up3L7YH1M514hMJ_3Npafw.png" /></figure><ul><li>Buat kelas Makanan yang mengimplementasikan interface Pembayaran dan mengisi metode hitungPajak() untuk menghitung pajak sebesar 5% dari harga. Sebagai contoh jawabannya kira-kira seperti ini :</li></ul><pre>class Makanan implements Pembayaran {<br>    @Override<br>    public double hitungPajak(double harga) {<br>        return harga * 0.05;<br>    }<br>}</pre><ul><li>Buat kelas Main yang membuat objek dari Elektronik dan Makanan, lalu panggil metode hitungPajak() untuk setiap produk dan tampilkan hasilnya. Sebagai contoh jawabannya kira-kira seperti ini :</li></ul><pre>public class PraktikumPBO_10 { <br>    public static void main(String[] args) {<br>        <br>        Pembayaran pajak_elektronik = new Elektronik(); <br>        System.out.println(&quot;Penjumlahan: Rp &quot; + pajak_elektronik.hitungPajak(1000000)); <br>        <br>        Pembayaran pajak_makanan = new Makanan(); <br>        System.out.println(&quot;Penjumlahan: Rp &quot; + pajak_makanan.hitungPajak(5000)); <br>    } <br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/714/1*CMolbCCcf6DLut7KVf6nMw.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0d402ec32e73" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to install MongoDB after failing once. And use it]]></title>
            <link>https://medium.com/@Akmal_Zidan/how-to-install-mongodb-after-failing-once-and-use-it-ab55f6a6c0cf?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/ab55f6a6c0cf</guid>
            <category><![CDATA[mongodb]]></category>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Thu, 05 Nov 2026 01:45:39 GMT</pubDate>
            <atom:updated>2026-11-05T01:45:39.840Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3lfCwQHPhlg41VYf" /><figcaption>Photo by <a href="https://unsplash.com/@rubaitulazad?utm_source=medium&amp;utm_medium=referral">Rubaitul Azad</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>What?</h3><p>Singkatnya, MongoDB merupakan sistem database bertipe NoSQL yang menyimpan data dalam format dokumen mirip JSON. MongoDB umumnya memiliki 2 versi yaitu Community Edition dan Enterprise Edition. Untuk perbedaanya kira-kira seperti ini :</p><ul><li>MongoDB Community Edition merupakan versi open source dari MongoDB, versi ini dapat digunakan secara gratis. Sementara MongoDB Enterprise Edition merupakan versi komersial</li><li>MongoDB Community Edition tidak memiliki dukungan teknis sementara MongoDB Enterprise Edition mendukung dukungan teknis 24/7 langsung dari teknisi ahli MongoDB</li><li>MongoDB Coommunity Edition umumnya tidak memiliki vitur yang mendukung administratif untuk perusahaan contohnya integrasi login database dengan sistem HRD kantor, mencatat log audit untuk legalitas hukum dan software visual untuk membackup server secara otomatis. Sementara versi enterprise mendukung itu semua</li></ul><h3>How? (It’s best to read the “Troubleshoot” section first)</h3><p>Untuk menginstall MongoDB comunity edition, hal pertama yang dapat dilakukan adalah mendapatkan command untuk menginstallnya, untuk mendapatkannya, cukup pergi ke web milik <a href="https://www.mongodb.com/docs/manual/administration/install-community/#std-label-install-mdb-community-edition">MongoDB</a>.</p><blockquote>Tiap OS memiliki command yang berbeda. <br>Versi dari dari MongoDB yang akan diinstall adalah versi 8 karena menawarkan kematangan versi yang sudah lebih dahulu teruji</blockquote><pre># commands for Debian/Ubuntu<br><br>curl -fsSL https://pgp.mongodb.com/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/964/1*XQcKhLl9ezVQOqdBAPW5yg.png" /></figure><h4>Add a repository</h4><p>Setelah mendapatkan kunci PGP MongoDB, langkah selanjutnya adalah menambahkan repository MongoDB sesuai dengan versi linux yang dipakai. Ini bermaksut agar OS mengetahui URL resmi untuk mengunduh aplikasi MongoDB. Sebagai contoh, OS yang digunakan computer ini adalah Debian 13 (codename: trixie) Untuk commandnya kira-kira seperti ini :</p><pre># for Debian 13 and MongoDB 8<br><br>echo &quot;deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/debian trixie/mongodb-org/8.0 main&quot; | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/959/1*PAozlJx6Ao2oiQH6lW8DTA.png" /></figure><h4>Update the package list and install MongoDB</h4><p>Fungsi dari memperbarui package list bertujuan agar sistem mengenali repositori yang baru saja ditambahkan dan mengeksekusi pemasangan aplikasi ke dalam server. Untuk commandnya kira-kira seperti ini :</p><pre>sudo apt update<br>sudo apt install -y mongodb-org</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/909/1*4MBSmEDRyF8MEKsIuMpprQ.png" /></figure><h3>Specifically for troubleshooting</h3><p>Ketika menjalankan perintah sudo apt update, mungkin ada kemungkinan <strong>error</strong> seperti alamat Security Update Tidak Valid atau Sertifikat SSL Mirror Kedaluwarsa. Untuk mengatasinya, pertama buka file konfigurasi sumber aplikasi utama. Untuk melakukannya kira-kira seperti ini :</p><pre>sudo nano /etc/apt/sources.list</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/830/1*3ODxDzkxqWY0cZdUsavfKQ.png" /></figure><p>Setelah membuka nano, langkah selanjutnya adalah mengubah isi file tersebut dengan command ini :</p><pre>deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware<br>deb http://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware<br>deb http://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/853/1*7Ae660dF_2UwGqrWJXJFWQ.png" /></figure><p>Setelelah mengubah isi alamat, langkah selanjutnya adalah menjalankan kembali perintah pembaruan untuk mengunduh katalog aplikasi terbaru secara normal.</p><pre>sudo apt-get update</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1004/1*eqVV6tmr-cNgRHtY-IfwDQ.png" /></figure><h4>Limitations for the latest OS version</h4><p>Pada OS terbaru seperti Debian 13 (codename: trixie), status dari Debian 13 masih dalam tahap pengembangan, ini membuat OS tersebut tidak sepenuhnya dijamin kompatibel dengan beberapa software. Sebagai contoh: setelah command sebelumnya berjalan tanpa error, langkah selanjutnya adalah menginstall kembali MongoDB</p><pre>sudo apt update<br>sudo apt install -y mongodb-org</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/619/1*xMR53WefUdeP6G2eQsIEZg.png" /></figure><p>Terlihat disana terdapat error. Error tersebut disebabkan karena pihak MongoDB belum secara resmi merilis file versi instalasi untuk MongoDB 8 (hanya tersedia MongoDB 9). Pada kasus sebelumnya, ada 2 cara untuk menyelesaikannya yaitu dengan mengunduh versi 9 atau meminjam repositori dari versi Debian 12 (Bookworm) yang sudah stabil dan sepenuhnya didukung oleh MongoDB.</p><blockquote>Opsi terbaik yang dapat dipilih adalah menaikan versi MongoDB ke versi 9 karena meminjam repository Debian 12 dinilai kemungkinan hanya menyelesaikan masalah instalasi saja. Untuk itu, hal yang perlu dilakukan adalah kembali ke langkah pertama.</blockquote><h3>Back to the beginning</h3><p>Hal pertama yang harus dilakukan adalah menghapus sisa konfigurasi versi 8.0 yang gagal dengan command ini :</p><pre>sudo rm /etc/apt/sources.list.d/mongodb*.list<br>sudo rm /usr/share/keyrings/mongodb-server-8.0.gpg</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/646/1*nBfvCSIPSmrASr6tgAqYgA.png" /></figure><h4>Install GPG</h4><p>Setelag menghapus sisa konfigurasi, langkah selanjutnya adalah menginstall Unduh GPG Key versi 9. Untuk commandnya seperti ini :</p><pre>curl -fsSL https://pgp.mongodb.com/server-9.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-9.gpg --dearmor</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cmz2SGtV0ZzfaT50Sx_-lQ.png" /></figure><h4>Add a repository</h4><p>Setelah menginstall GPG, langkah selanjutnya adalah menambahkan repository. Cukup gunakan command ini :</p><pre>echo &quot;deb [ signed-by=/usr/share/keyrings/mongodb-server-9.gpg ] https://repo.mongodb.org/apt/debian trixie/mongodb-org/9.0 main&quot; | sudo tee /etc/apt/sources.list.d/mongodb-org-9.0.list</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Sd_OWWOzy1Mgm2ze6ByG6Q.png" /></figure><h4>Update and Install</h4><p>Setelah menambahkan repository, langkah selanjutnya adalah melakukan update dan install. Untuk melakukannya cukup gunakan command ini :</p><pre>sudo apt-get update<br>sudo apt-get install -y mongodb-org</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eK7pshZ4vIbjtAkWcXt4SA.png" /></figure><h4>Run</h4><p>Setelah proses penginstallan selesai, langkah selanjutnya adalah menjalankan MongoDB tersebut dengan menghidupkan database servernya. Untuk melakukannya, cukup gunakan command ini :</p><pre># Run MongoDB as a service<br>sudo systemctl start mongod<br><br># Start MongoDB after every boot (optional)<br>sudo systemctl enable mongod</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/468/1*Q6hbdDx1BWN_q202eFYsrQ.png" /></figure><h4>MongoDB verification</h4><p>Setelah menjalankan MongoDB, langkah selanjutnya adalah melakukan verifikasi apakah MongoDB berjalan dengan normal sekaligus mengecek versinya. Untuk melakukannya, cukup gunakan command ini :</p><pre>sudo systemctl status mongod<br>mongod --version</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*c52aMQ4bLaueR9WKfgIWag.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/511/1*y18EM_BDET9VUInHmCqXhg.png" /></figure><h3>Try something simple</h3><p>Setelah melakukan installasi MongoDB, langkah selanjutnya adalah mencobanya. Untuk mencobanya, cukup gunakan command ini pada terminal :</p><pre>mongosh</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1011/1*1McqytKW2XjzSIOuL3fHcg.png" /></figure><p>Pada menu tersebut, ada beberapa command yang dapat dicoba antara lain seperti membuat database atau berpindah database jika database tersebut sudah ada. Untuk commandnya kira-kira seperti ini :</p><pre>use praktikum_bigdata</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/286/1*vL74qgoYp1a4UeAzflellg.png" /></figure><p>Didalam database tersebut, ada beberapa hal yang dapat dicoba antara lain seperti membuat dokumen dan mengisinya langsung. Sebagai contoh kira-kira seperti ini :</p><pre>db.produk.insertOne({nama_produk : &quot;takegawa desmo&quot;, kategori : &quot;engine&quot;, harga : 10900000, stok : 2})</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/518/1*-0nRf-FLjZJpyoAOOcDzPA.png" /></figure><p>Perintah lain seperti mencari data juga dapat dilakukan. Sebagai contoh kira-kira seperti ini :</p><pre>db.produk.find()<br><br># another option<br>db.produk.find().pretty()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/386/1*sSSPupRKSOJEvT3euF7Eyg.png" /></figure><p>lalu untuk keluar cukup gunakan command ini :</p><pre>exit</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/258/1*owq8uIt6FIfzY7Udl09biQ.png" /></figure><h3>Integration</h3><p>Setelah mencoba sebentar seperti apa MongoDB, langkah selanjutnya adalah melakukan integrasi antara MongoDB dengan Jupyter Notebook. Untuk melakukan integrasi, hal pertama yang harus diinstall adalah mengunduh dan menginstal pustaka PyMongo menggunakan manajer paket Python lalu mengecek versinya. Sebagai contoh kira-kira seperti ini</p><pre>pip install pymongo<br>python -c &quot;import pymongo; print(&#39;PyMongo&#39;, pymongo.version)&quot;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/741/1*ALu3nMH5df1ICq1zjyLspw.png" /></figure><h4>Try it at Jupyter notebook</h4><p>Setelah melakukan integrasi, langkah selanjutnya adalah mencobanya langsung di Jupyter Notebook. Untuk mencobanya, gunakan code ini :</p><pre>from pymongo import MongoClient<br><br># Membuat koneksi ke MongoDB yang berjalan di localhost, port default 27017<br>client = MongoClient(&quot;mongodb://localhost:27017/&quot;)<br><br># Memilih (atau otomatis membuat) database<br>db = client[&quot;praktikum_bigdata&quot;]<br><br># Memilih (atau otomatis membuat) collection<br>koleksi_produk = db[&quot;produk&quot;]<br><br>print(&quot;Koneksi ke MongoDB berhasil!&quot;)<br>print(&quot;Daftar database yang ada:&quot;, client.list_database_names())</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/582/1*QIJPT-YDJrkr1ObpLW84eQ.png" /></figure><h3>CRUD</h3><p>Setelah mencoba menggunakan mongoDB di jupyter, langkah selanjutnya adalah mencoba CRUD (create, read, update, delete)</p><h4>Create</h4><p>Pada operasi ini, hal yang akan dicoba adalah menambahkan data pada database. Ada 2 cara untuk menambahkan data, untuk caranya kira-kira seperti ini :</p><pre># hanya menyisipkan 1 data<br>koleksi_produk.insert_one({<br>    &quot;nama_produk&quot; : &quot;Daytona Anima&quot;,<br>    &quot;kategori&quot; : &quot;custom performance&quot;,<br>    &quot;harga&quot; : 17000000,<br>    &quot;stok&quot; : 4,<br>    &quot;tags&quot; : [&quot;custom engine&quot;,&quot;160cc&quot;]<br>})<br><br># menyisipkan lebih banyak data<br>koleksi_produk.insert_many([<br>    {&quot;nama_produk&quot; : &quot;Uma Racing ECU&quot; , &quot;kategori&quot;: &quot;custom performance&quot; , &quot;harga&quot; : 5000000 , &quot;stok&quot; : 11 , &quot;tags&quot; : [&quot;ECU&quot;, &quot;ECU custom&quot;]},<br>    {&quot;nama_produk&quot; : &quot;KTC Absorber Adjustable&quot; , &quot;kategori&quot; : &quot;custom part&quot; , &quot;harga&quot; : 2000000 , &quot;stok&quot; : 20 , &quot;tags&quot; : [&quot;Shock&quot;, &quot;KTC&quot;]},<br>    {&quot;nama_produk&quot; : &quot;Brembo GP4&quot; , &quot;kategori&quot; : &quot;custom part&quot; , &quot;harga&quot; : 30000000 , &quot;stok&quot; : 3 , &quot;tags&quot; : [&quot;Brembo&quot;, &quot;Break&quot;]},<br>    {&quot;nama_produk&quot; : &quot;Accossato ESC022&quot; , &quot;kategori&quot; : &quot;custom part&quot; , &quot;harga&quot; : 1453324 , &quot;stok&quot; : 2 , &quot;tags&quot; : [&quot;HandBreak&quot;, &quot;Accossato&quot;]}<br>])<br><br>print(&quot;jumlah data&quot;, koleksi_produk.count_documents({}))</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sTp8sBem7AcCoyCGOfHArw.png" /></figure><h4>Read</h4><p>Pada operasi read simpelnya digunakan untuk menampilkan data yang sudah ada. Sebagai contoh kira-kira seperti ini :</p><pre>satu_produk = koleksi_produk.find_one({&quot;kategori&quot;: &quot;custom part&quot;})<br>print(&quot;Satu produk kategori custom part:&quot;, satu_produk)<br><br>print()<br><br># find() — mengambil SEMUA dokumen yang cocok (mengembalikan cursor, di-looping atau di-list())<br>print(&quot;Seluruh produk kategori custom part:&quot;)<br>for p in koleksi_produk.find({&quot;kategori&quot;: &quot;custom part&quot;}):<br>    print(f&quot;  - {p[&#39;nama_produk&#39;]} (Rp{p[&#39;harga&#39;]:,})&quot;)<br><br>print()<br><br># Filter dengan operator perbandingan<br>print(&quot;Produk dengan harga &gt; 5000000:&quot;)<br>for p in koleksi_produk.find({&quot;harga&quot;: {&quot;$gt&quot;: 5000000}}):<br>    print(f&quot;  - {p[&#39;nama_produk&#39;]} (Rp{p[&#39;harga&#39;]:,})&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-jnAHC4IZ-LPdDRqsU6-IA.png" /></figure><h4>Update</h4><p>Operasi ini berfungsi untuk mengubah atau mengedit data yang sudah tersimpan di database. Sebagai contoh kira-kira seperti ini :</p><pre># update_one() — memperbarui SATU dokumen pertama yang cocok<br>koleksi_produk.update_one(<br>    {&quot;nama_produk&quot;: &quot;Daytona Anima&quot;},<br>    {&quot;$set&quot;: {&quot;harga&quot;: 210000000}}   # menaikkan harga<br>)<br><br># update_many() — memperbarui SEMUA dokumen yang cocok<br>koleksi_produk.update_many(<br>    {&quot;kategori&quot;: &quot;custom performance&quot;},<br>    {&quot;$inc&quot;: {&quot;stok&quot;: -1}}   # $inc mengubah nilai relatif (increment/decrement)<br>)<br><br>print(&quot;Setelah update:&quot;)<br>for p in koleksi_produk.find({}, {&quot;_id&quot;: 0, &quot;nama_produk&quot;: 1, &quot;harga&quot;: 1, &quot;stok&quot;: 1}):<br>    print(f&quot;  - {p[&#39;nama_produk&#39;]}: harga=Rp{p[&#39;harga&#39;]:,}, stok={p[&#39;stok&#39;]}&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/776/1*uFZgSe691wh1Jnj0GDTQDQ.png" /></figure><h4>Delete</h4><p>Operasi ini berfungsi untuk menghapus data yang sudah ada pada database. Sebagai contoh kira-kira seperti ini :</p><pre># delete_one() — menghapus SATU dokumen pertama yang cocok<br>koleksi_produk.delete_one({&quot;nama_produk&quot;: &quot;KTC Absorber Adjustable&quot;})<br><br>print(&quot;Jumlah dokumen tersisa:&quot;, koleksi_produk.count_documents({}))<br>print(&quot;Daftar produk tersisa:&quot;, [p[&quot;nama_produk&quot;] for p in koleksi_produk.find({}, {&quot;nama_produk&quot;: 1, &quot;_id&quot;: 0})])</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C_VjhGvNWAVHbn_ZOFB0eg.png" /></figure><h3>MongoDB data integration</h3><p>Setelah mencoba CRUD, hal yang dapat dicoba adalah mengintegrasi data yang ada pada MongoDB dengan Spark DataFrame. Integrasi ini dilakukan agar Spark DataFrame dapat membaca data yang ada pada MongoDB. Proses integrasi dimulai dari pengambilan data yang ada pada MongoDB lalu mengubahnya menjadi pandas DataFrame lalu diubah lagi menjadi Spark DataFrame. Untuk contoh kodenya kira-kira seperti ini :</p><pre>from pyspark.sql import SparkSession<br>import pandas as pd<br><br>spark = SparkSession.builder \<br>    .appName(&quot;Pertemuan9-MongoDBSpark&quot;) \<br>    .master(&quot;local[*]&quot;) \<br>    .getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br># Langkah 1: Ambil seluruh dokumen dari MongoDB sebagai list of dict<br>dokumen_mongo = list(koleksi_produk.find({}))<br><br># Langkah 2: Ubah menjadi pandas DataFrame<br>df_pandas = pd.DataFrame(dokumen_mongo)<br><br># Langkah 3: Tipe data khusus MongoDB (_id, dan kolom berisi list seperti &quot;tags&quot;)<br># perlu disesuaikan dulu agar Spark dapat membacanya dengan benar<br>df_pandas[&quot;_id&quot;] = df_pandas[&quot;_id&quot;].astype(str)<br>df_pandas[&quot;tags&quot;] = df_pandas[&quot;tags&quot;].apply(lambda x: &quot;, &quot;.join(x) if isinstance(x, list) else &quot;&quot;)<br><br># Langkah 4: Konversi ke Spark DataFrame<br>df_spark_produk = spark.createDataFrame(df_pandas)<br><br>df_spark_produk.printSchema()<br>df_spark_produk.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/996/1*NL0DD3Q3pTAclKsmzSrtFw.png" /></figure><p>Setelah mengubah data dari MongoDB ke Spark DataFrame, langkah selanjutnya adalah mencoba fungsi-fungsi yang ada pada Spark DataFrame. Sebagai contoh kira-kira seperti ini :</p><pre>from pyspark.sql.functions import avg, count<br><br># Contoh analisis sederhana: rata-rata harga &amp; jumlah produk per kategori<br>df_spark_produk.groupBy(&quot;kategori&quot;).agg(<br>    avg(&quot;harga&quot;).alias(&quot;rata_rata_harga&quot;),<br>    count(&quot;nama_produk&quot;).alias(&quot;jumlah_produk&quot;)<br>).show()<br><br>spark.stop()<br>print(&quot;SparkSession ditutup.&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/669/1*6UsLXGFViyEQgOIuFB5wyQ.png" /></figure><p>Setelah mencoba mempelajari penggunaan MongoDB dan integrasinya, hal yang dapat dicoba adalah mengerjakan beberapa soal.</p><h4>First question</h4><p>Soal pertama meminta penjawab untuk menyisipkan 5 dokumen baru ke dalam collection, soalnya terlihat seperti ini “Sisipkan (`insert_many`) lima dokumen baru ke collection `produk` dengan kategori bebas (boleh kategori baru selain Makanan/Minuman, misalnya “Snack”)”. Untuk menjawabnya kira-kira seperti ini :</p><pre>collections_produk = db[&quot;produk&quot;]<br><br>collections_produk.insert_many ([<br>    {&quot;nama_produk&quot; : &quot;Laksa&quot; , &quot;kategori&quot; : &quot;makanan&quot; , &quot;harga&quot; : 20000 , &quot;stok&quot; : 9 , &quot;tags&quot; : [&quot;kuah&quot; , &quot;makanan berat&quot; , &quot;pedas&quot;]},<br>    {&quot;nama_produk&quot; : &quot;croisant&quot; , &quot;kategori&quot; : &quot;snack&quot; , &quot;harga&quot; : 10000 , &quot;stok&quot; : 30 , &quot;tags&quot; : [&quot;snack&quot; , &quot;roti&quot; , &quot;france&quot;]},<br>    {&quot;nama_produk&quot; : &quot;ramen&quot; , &quot;kategori&quot; : &quot;makanan&quot; , &quot;harga&quot; : 25000 , &quot;stok&quot; : 15 , &quot;tags&quot; : [&quot;kuah&quot; , &quot;makanan berat&quot; , &quot;mie&quot;]},<br>    {&quot;nama_produk&quot; : &quot;matcha latte&quot; , &quot;kategori&quot; : &quot;minuman&quot; , &quot;harga&quot; : 10000 , &quot;stok&quot; : 18 , &quot;tags&quot; : [&quot;jepang&quot; , &quot;hijau&quot;]}<br>])</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LPWRxN6odZ-FIDDca3ideg.png" /></figure><h4>Second question</h4><p>Soal kedua meminta penjawab untuk mencari produk dengan kriteria tertentu, soalnya terlihat seperti ini “Gunakan `find()` dengan operator `$lt` (kurang dari) untuk menampilkan seluruh produk dengan `harga` di bawah 20000”. Untuk menjawabnya kira-kira seperti ini :</p><pre>for f in collections_produk.find({&quot;harga&quot; : {&quot;$lt&quot; : 20000}}):<br>    print(f&#39;nama barang : {f[&quot;nama_produk&quot;]:&lt;16} kategori : {f[&quot;kategori&quot;]:&lt;16} harga : {f[&quot;harga&quot;]}&#39;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/919/1*WaiGAnCH_qadJcNDp8dAwg.png" /></figure><h4>Third question</h4><p>Soal ketiga meminta penjawab untuk menambahkan field baru, soalnya terlihat seperti ini “Gunakan `update_many()` untuk menambahkan field baru bernama `diskon` bernilai `0` ke seluruh dokumen pada collection `produk` (petunjuk: gunakan operator `$set`)”. Untuk me njawabnya kira-kira seperti ini :</p><pre>collections_produk.update_many(<br>    {},<br>    {&quot;$set&quot; : {&quot;diskon&quot; : 0}}<br>)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/1*sZLPoWhq5SnJGPCRg-rxgg.png" /></figure><h4>Four question</h4><p>Soal keempat terlihat seperti ini “Dalam 2–3 kalimat: berikan satu contoh skenario nyata (boleh di luar konteks e-commerce yang sering kita pakai) di mana MongoDB akan menjadi pilihan lebih tepat dibanding tabel relasional biasa, dan jelaskan alasannya berdasarkan konsep <em>flexible schema</em>. Tulis jawaban pada markdown cell di bawah ini”. Untuk jawabannya kira-kira seperti ini :</p><pre>Skenario seperti analisis teknis dunia balapan menjadi salah satu skenario<br>dimana MongoDB menjadi pilihan yang lebih tepat dari tabel konvensional. <br>Data data yang dihasilkan di trek seperti suhu lingkungan, suhu kendaraan,<br>bentuk kendaraan dan lainnya sangat mempengaruhi hasil balapan.<br>Pabrikan dapat menggunakan data-data tersebut untuk menganalisis alasan-<br>alasan teknis kenapa salah satu Tim balap bisa menang balapan</pre><p>Setelah mengerjakan soal-soal tersebut, ada soal yang dapat dicoba kembali. Untuk soalnya terlihat seperti ini</p><h3>Question</h3><p>Platform “Kopi Nusantara” (skenario yang sama dari Tugas Mandiri Pertemuan 7) ingin mulai menyimpan katalog menu mereka di MongoDB — karena setiap cabang punya menu musiman/spesial dengan atribut yang berbeda-beda (tidak semua menu punya atribut yang sama, misalnya hanya menu kopi yang punya atribut “tingkat_kepahitan”, sementara menu makanan punya atribut “pedas_level”). Kalian ditugaskan membangun dan menganalisis katalog ini.</p><h4>Question 1 : Membangun Katalog (Create)</h4><p>Buat database baru bernama `kopi_nusantara`, collection bernama `menu`. Sisipkan **minimal 12 dokumen** menu dengan field bervariasi sesuai kategorinya:</p><ul><li>Menu kategori **”Kopi”**: wajib memiliki field `nama_menu`, `harga`, `kategori`, dan `tingkat_kepahitan` (skala 1–5).</li><li>Menu kategori **”Makanan”**: wajib memiliki field `nama_menu`, `harga`, `kategori`, dan `pedas_level` (skala 0–3).</li><li>Boleh menambahkan field lain sesuai kreativitas anda (mis. `stok`, `rekomendasi_barista`).</li></ul><pre>db = client[&quot;kopi_nusantara&quot;]<br><br>menu = db[&quot;produk&quot;]<br><br>menu.insert_many ([<br>    {&quot;nama_menu&quot; : &quot;americano&quot; , &quot;harga&quot; : 10000 , &quot;kategori&quot; : &quot;kopi&quot; , &quot;tingkat_kepahitan&quot; : 3},<br>    {&quot;nama_menu&quot; : &quot;cappucino&quot; , &quot;harga&quot; : 15000 , &quot;kategori&quot; : &quot;kopi&quot; , &quot;tingkat_kepahitan&quot; : 1},<br>    {&quot;nama_menu&quot; : &quot;italiano&quot; , &quot;harga&quot; : 10000 , &quot;kategori&quot; : &quot;kopi&quot; , &quot;tingkat_kepahitan&quot; : 5},<br>    {&quot;nama_menu&quot; : &quot;laksa&quot; , &quot;harga&quot; : 20000 , &quot;kategori&quot; : &quot;makanan&quot; , &quot;tingkat_pedas&quot; : 3},<br>    {&quot;nama_menu&quot; : &quot;rendang&quot; , &quot;harga&quot; : 50000 , &quot;kategori&quot; : &quot;makanan&quot; , &quot;tingkat_pedas&quot; : 2},<br>    {&quot;nama_menu&quot; : &quot;shawarma&quot; , &quot;harga&quot; : 18000 , &quot;kategori&quot; : &quot;makanan&quot; , &quot;tingkat_pedas&quot; : 1}<br>])</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bXK4PcTUJRNSlolbMpBmXg.png" /></figure><h4>Question 2 : <strong>Kueri Bertingkat (Read)</strong></h4><p>Tampilkan hasil dari <strong>tiga</strong> kueri berikut :</p><ol><li>Seluruh menu kategori “Kopi” dengan tingkat_kepahitan di atas 3.</li><li>Seluruh menu dengan harga di antara 15000 dan 30000.</li><li>Menu yang <strong>tidak memiliki</strong> field pedas_level sama sekali.</li></ol><pre>for find in menu.find({&quot;kategori&quot; : &quot;kopi&quot;} and {&quot;tingkat_kepahitan&quot; : {&quot;$gt&quot; : 3}}):<br>    print(&quot;kategori kopi dengan tingkat kepahitan diatas 3 :&quot;, find[&quot;nama_menu&quot;])<br><br>print()<br><br>for find2 in menu.find({&quot;harga&quot; : {&quot;$gt&quot; : 30000}} and {&quot;harga&quot; : {&quot;$lt&quot; : 15000}}):<br>    print(&quot;menu diantara harga 15000 sampai 30000 :&quot;, find2[&quot;nama_menu&quot;])<br><br>print()<br><br>for find3 in menu.find({&quot;tingkat_pedas&quot; : None}):<br>    print(&quot;Menu yang tidak memiliki tingkat pedas :&quot;, find3[&quot;nama_menu&quot;])</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/765/1*RzYYMbq0b-ZZkpRLDBZ2bg.png" /></figure><h4>Question 3 : <strong>Pembaruan Data (Update)’</strong></h4><p>Tambahkan field status bernilai &quot;Tersedia&quot; ke seluruh dokumen menggunakan update_many(). Kemudian, ubah status menjadi &quot;Habis&quot; khusus untuk 2 menu pilihan anda menggunakan update_one()</p><pre>menu.update_many(<br>    {},<br>    {&quot;$set&quot; : {&quot;status&quot; : &quot;tersedia&quot;}}<br>)<br><br>menu.update_one(<br>    {&quot;nama_menu&quot; : &quot;laksa&quot;},<br>    {&quot;$set&quot; : {&quot;status&quot; : &quot;habis&quot;}}<br>)<br>        <br>menu.update_one(<br>    {&quot;nama_menu&quot; : &quot;rendang&quot;},<br>    {&quot;$set&quot; : {&quot;status&quot; : &quot;habis&quot;}}<br>)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/857/1*HI4SiSU9UCyWd_mLBl9enw.png" /></figure><h4>Question 4 : <strong>Integrasi ke Spark</strong></h4><p>Ambil seluruh data dari collection menu, ubah menjadi Spark DataFrame (ikuti pola Sub-bab 9.6 — perhatikan field yang mungkin kosong/null pada sebagian dokumen, seperti tingkat_kepahitan yang hanya dimiliki menu Kopi). Tampilkan:</p><ol><li>printSchema() hasil konversi.</li><li>Rata-rata harga per kategori menggunakan groupBy.</li></ol><pre>from pyspark.sql import SparkSession<br>import pandas as pd<br>from pyspark.sql.functions import sum as spark_sum, count, avg<br>import numpy as np<br><br>spark = SparkSession.builder \<br>    .appName(&quot;Pertemuan9-MongoDBSpark&quot;) \<br>    .master(&quot;local[*]&quot;) \<br>    .getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>c = menu.find({})<br><br>doc_mongo = list(c)<br><br>panda = pd.DataFrame(doc_mongo)<br><br>if &#39;_id&#39; in panda.columns:<br>    panda[&#39;_id&#39;] = panda[&#39;_id&#39;].astype(str)<br><br>panda[&#39;tingkat_kepahitan&#39;] = panda[&#39;tingkat_kepahitan&#39;].replace({np.nan: None})<br>panda[&#39;tingkat_pedas&#39;] = panda[&#39;tingkat_pedas&#39;].replace({np.nan: None})<br><br>spk = spark.createDataFrame(panda)<br>spk.printSchema()<br><br>rata_rata = spk.groupBy(&quot;kategori&quot;).agg(<br>    avg(&quot;harga&quot;).alias(&quot;rata_rata_harga&quot;)<br>)<br>rata_rata.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/647/1*JV4_Uwj37Nb-Su8vYKgvYw.png" /></figure><h4>Question 5 : Kesimpulan</h4><p>Tulis pada markdown cell (minimal 100 kata): apa tantangan yang anda temui saat mengonversi data MongoDB (dengan field yang tidak seragam antar dokumen) menjadi Spark DataFrame (yang mengharuskan skema tabel seragam)? Bagaimana anda mengatasinya?</p><pre>pada awalnya, tidak ada tantangan konversi data dari mongodb ke Spark <br>dataframe secara kode. Namun setelah mencari tau, nilai NaN atau Not a Number <br>akan menghasilkan masalah misalnya pada skenario ketika ingin melakukan <br>operasi matematika atau agregasi misalnya seperti mencari rata-rata atau <br>mencari total, menggunakan Spark SQL pada kolom yang mengandung NaN akan <br>menghasilkan perhitungan yang berantakan atau mengembalikan NaN lagi. Oleh <br>karena itu, data bernilai NaN atau Not as Number dapat diubah nilainya dengan <br>2 cara yaitu dengan mengubahnya menjadi 0 atau mengubahnya menjadi null. Untuk <br>mengubahnya, pada saat dokumen berada pada format panda, data yang bernilai <br>NaN dapat diubah nilainya sesuai dengan preferensi masing masing atau sesuai <br>ketentuan kode yang berlaku</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ab55f6a6c0cf" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The very essence of an object lies in this concept]]></title>
            <link>https://medium.com/@Akmal_Zidan/the-very-essence-of-an-object-lies-in-this-concept-4707aac2daee?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/4707aac2daee</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[abstract]]></category>
            <category><![CDATA[jawa]]></category>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Wed, 28 Oct 2026 02:00:23 GMT</pubDate>
            <atom:updated>2026-10-28T02:00:23.127Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pbM9vcKORglGp6zQ" /><figcaption>Photo by <a href="https://unsplash.com/@orbtalmedia?utm_source=medium&amp;utm_medium=referral">orbtal media</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Dalam pemrograman berorientasi objek, terdapat suatu konsep yang dapat menjadi dasar suatu objek, dasar yang dimaksut adalah fungsi universal yang dapat digunakan banyak objek namun tetap dengan keunikan masing-masing. Konsep tersebut adalah….</p><h3>What?</h3><p>Abstraksi merupakan konsep dasar pemrograman berorientasi objek yang menyederhanakan cara kerja program dengan menyembunyikan detail implementasi dan hanya menampilkan fungsionalitas penting dari suatu objek.</p><h4>Abstraction class</h4><p>Umumnya, konsep abstraksi ini dalam bahasa Java diwujudkan dalam bentuk class, namun terdapat perbedaan mendasar class abstraksi berbeda dari class biasa.</p><p>Perbedaan paling dasar antara class abstraksi dan class biasa adalah terletak pada kemampuannya berubah menjadi objek. Umumnya, class biasa dapat berubah langsung menjadi objek namun tidak dengan class abstraksi. Hal ini terjadi karena sifat dari class abstraksi sendiri masih berupa konsep atau gambaran umum, bukan bentuk riil atau konkret yang siap dipakai.</p><h3>How?</h3><p>Untuk mempraktekan abstraksi dinilai mudah karena konsep ini masih termasuk dasar dari pemrograman berorientasi objek.</p><h4>Create a class</h4><p>Sebagai permulaan, yang diperlukan untuk mempraktekan konsep ini adalah dengan membuat class abstraksi terlebih dahulu. Sebagai contoh kira-kira seperti ini :</p><pre>abstract class Kendaraan {}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/226/1*VXQE7nBZAsw_nXj84iFyqw.png" /></figure><p>Class tersebut akan difungsikan menjadi class abstraksi. Karena class tersebut masih kosong, maka hal yang bisa ditambahkan selanjutnya adalah method. Sebagai contoh, kira-kira seperti ini :</p><pre>abstract class Kendaraan {<br>    abstract void berjalan ();<br>       <br>    void info () {<br>       System.out.println(&quot;Ini adalah kendaraan.&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/440/1*FGoM6nnSsiUEzUg3DapUag.png" /></figure><h4>Create a subclass</h4><p>Karena class abstraksi tidak dapat diubah menjadi objek maka fungsi subclass disini adalah untuk menerapkan konsep abstraksi namun tetap mempertahankan kemampuannya menjadi objek, lalu pada subclass ditambahkan method yang sesuai dengan class abstraksi tersebut. Sebagai contoh kira-kira seperti ini :</p><pre>abstract class Kendaraan {<br>    abstract void berjalan ();<br>       <br>    void info () {<br>       System.out.println(&quot;Ini adalah kendaraan.&quot;);<br>    }<br>}<br><br><br><br>class Mobil extends Kendaraan {<br>    @Override<br>    void berjalan() {<br>        System.out.println(&quot;Mobil sedang berjalan dengan cepat.&quot;);<br>    }<br>}<br><br>class Sepeda extends Kendaraan {<br>    @Override<br>    void berjalan() {<br>        System.out.println(&quot;Sepeda sedang berjalan dengan pelan.&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/561/1*BSG_d5zbP7mRIFUxRhHcgQ.png" /></figure><h4>Try it</h4><p>Setelah membuat class abstraksi dan subclassnya, code tersebut sudah sepenuhnya dapat di coba. Untuk mencobanya, kira-kira seperti ini :</p><pre>abstract class Kendaraan {<br>    abstract void berjalan ();<br>       <br>    void info () {<br>       System.out.println(&quot;Ini adalah kendaraan.&quot;);<br>    }<br>}<br><br><br><br>class Mobil extends Kendaraan {<br>    @Override<br>    void berjalan() {<br>        System.out.println(&quot;Mobil sedang berjalan dengan cepat.&quot;);<br>    }<br>}<br><br>class Sepeda extends Kendaraan {<br>    @Override<br>    void berjalan() {<br>        System.out.println(&quot;Sepeda sedang berjalan dengan pelan.&quot;);<br>    }<br>}<br>    <br>    <br>    <br>public class PraktikumPBO_9 {<br>    public static void main(String[] args) {<br>        Kendaraan mobil = new Mobil();<br>        Kendaraan sepeda = new Sepeda();<br><br>        mobil.berjalan();<br>        mobil.info();<br><br>        sepeda.berjalan();<br>        sepeda.info();<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/652/1*RtZIfo5WyLFo9KTEIhi6LQ.png" /></figure><p>Setelah mempelajari konsep abstraksi dan pengaplikasiannya, terdapat soal yang dapat dikerjakan, sebagai contoh kira-kira seperti ini</p><h3>What are the questions like?</h3><p>Soal ini membahas tentang pengaplikasian konsep abstraksi secara sedikit lebih luas yaitu konsep abstraksi sebagai gambaran umum dan subclass sebagai objek asli yang memiliki gambaran umum tersebut.</p><h4>First question</h4><p>Soal pertama meminta penjawab untuk membuat class abstrak dan metodenya, metode ini merupakan gambaran umum dari class tersebut. Soal tersebut berbunyi “Buat kelas abstrak Hewan dengan metode abstrak suara()”. Untuk menjawabnya kira-kira seperti ini :</p><pre>abstract class Hewan {<br>    abstract void suara();<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/234/1*gC4lQ1134HhBWUZnPUA_Zw.png" /></figure><h4>Second question</h4><p>Soal kedua meminta penjawab untuk membuat class turunan yang berisi method. Soal tersebut berbunyi “Buat dua kelas turunan, yaitu Kucing dan Anjing, yang mengimplementasikan metode suara() sesuai dengan suara hewan tersebut”. Untuk menjawabnya kira-kira seperti ini :</p><pre>abstract class Hewan {<br>    abstract void suara();<br>}<br><br>class Kucing extends Hewan {<br>    @Override<br>    void suara() {<br>        System.out.println(&quot;Meong&quot;);<br>    }<br>}<br><br>class Anjing extends Hewan {<br>    @Override<br>    void suara() {<br>        System.out.println(&quot;Guk Guk&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/313/1*UtXAc7VUeMRiFJ0Y9kiWLw.png" /></figure><h4>Third question</h4><p>Soal ketiga meminta penjawab untuk menampilkan hasil dari code tersebut. Soal tersebut berbunyi “Contoh Output yang Diharapkan: Kucing mengeluarkan suara = Meong, Anjing mengeluarkan suara = Guk Guk”. Untuk menjawabnya kira-kira seperti ini :</p><pre>abstract class Hewan {<br>    abstract void suara();<br>}<br><br>class Kucing extends Hewan {<br>    @Override<br>    void suara() {<br>        System.out.println(&quot;Meong&quot;);<br>    }<br>}<br><br>class Anjing extends Hewan {<br>    @Override<br>    void suara() {<br>        System.out.println(&quot;Guk Guk&quot;);<br>    }<br>}<br>    <br>public class PraktikumPBO_9 {<br>    public static void main(String[] args) {<br>        Hewan rigby = new Kucing();<br>        rigby.suara();<br>        <br>        Hewan dawg = new Anjing();<br>        dawg.suara();<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/534/1*ZhJmXTsfdvE6efuYhr93dA.png" /></figure><blockquote>Tiap objek di dunia punya fungsi dasar, sebagai contoh fungsi dasar mahkluk hidup salah satunya adalah berjalan. Konsep berjalan ini dimiliki umumnya oleh binatang dan manusia. Namun ini tidak berarti binatang berjalan dengan cara yang sama dengan manusia, contohnya kucing berjalan dengan 4 kaki dan manusia menggunakan 2 kaki. Intinya, abstraksi menciptakan dasar dari method yang dimiliki objek sementara subclass menjadi tempat fungsi detail dari mahkluk yang memiliki fungsi tersebut</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4707aac2daee" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to virtually separate devices (without adding more devices)]]></title>
            <link>https://medium.com/@Akmal_Zidan/how-to-virtually-separate-devices-without-adding-more-devices-e80cc1bcf691?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/e80cc1bcf691</guid>
            <category><![CDATA[cisco]]></category>
            <category><![CDATA[vlan-configuration]]></category>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Tue, 27 Oct 2026 08:02:41 GMT</pubDate>
            <atom:updated>2026-10-27T08:02:41.421Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NkMQCe3lIYuvfZt9" /><figcaption>Photo by <a href="https://unsplash.com/@fslfsl?utm_source=medium&amp;utm_medium=referral">Domaintechnik</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Orang awam umumnya membuat 2 jaringan untuk memisahkan 2 pengguna, atau menambah perangkat keras baru untuk memisahkan 2 pengguna berbeda, hal ini dinilai menambah pengeluaran karena pengguna harus membeli perangkat keras baru. Untuk mengatasi ini, ternyata ada model jaringan yang dapat dimanfaatkan</p><h3>What?</h3><p>VLAN (virtual local area network) merupakan sebuah model jaringan yang memungkinkan untuk membagi satu jaringan fisik (LAN) menjadi beberapa jaringan logis yang terpisah secara virtual. Walau terdapat 2 perangkat yang terhubung ke switch fisik yang sama, perangkat pada VLAN yang beda tidak dapat saling berkomunikasi secara langsung.</p><p>Cara kerja dari VLAN sendiri simpelnya VLAN bekerja di Layer 2 (Data Link) pada model OSI menggunakan standar IEEE 802.1Q. Saat data pengiriman data berlangsung, switch akan menambahkan label khusus yang berisi VLAN ID. Label ini berguna untuk menandai data hanya dikirim ke perangkat yang terdaftar pada VLAN ID yang sama.</p><h4>Benefit?</h4><p>Ada beberapa fungsi atau kegunaan yang dimiliki oleh VLAN antara lain</p><ol><li><strong>Keamanan Tambahan:</strong> VLAN dapat berfungsi sebagai keamanan tambahan dengan memisahkan lalu lintas data sensitif. Dalam skenario umum, suatu jaringan dibagi menjadi 2 VLAN. 1 VLAN untuk pemilik dan 1 VLAN lagi untuk tamu.</li><li><strong>Segmentasi Jaringan:</strong> Dalam skenario jaringan yang direncanakan untuk digunakan berbagai tipe pengguna, VLAN dapat mengelompokkan perangkat berdasarkan fungsi, tim, atau aplikasi, bukan berdasarkan lokasi fisiknya</li><li><strong>Mengurangi <em>Broadcast Traffic</em>:</strong> Umumnya switch jaringan akan mengirimkan pesan <em>broadcast</em> ke seluruh komputer yang terhubung. Ini menyebabkan traffic menjadi ramai. VLAN berguna untuk membatasi domain <em>broadcast</em> agar tidak membanjiri seluruh jaringan fisik, sehingga kinerja jaringan tetap optimal</li><li><strong>Efisiensi Biaya:</strong> Menghemat kabel dan perangkat keras karena tidak perlu membeli switch terpisah untuk setiap kelompok/departemen</li></ol><h4>Type?</h4><p>VLAN memiliki beberapa tipe berdasarkan metode atau cara kerjanya</p><ul><li>Berdasarkan Port (Port-based VLAN)<br>ini merupakan metode yang paling umum digunakan pada VLAN. Simpelnya, VLAN bekerja dengan memisahkan perangkat berdasarkan port yang digunakan</li><li>Berdasarkan MAC Address (MAC-based VLAN)<br>metode VLAN ini memanfaatkan MAC address pada perangkat yang terhubung. Kelebihan utamanya adalah perangkat tersebut akan tetap terhubung ke VLAN yang sama walau berpindah port switch mana saja asalkan tetap pada jaringan yang sama</li><li>Berdasarkan Alamat Subnet IP (IP Subnet-based VLAN)<br>metode VLAN ini memanfaatkan IP address yang terdaftar pada jaringan tersebut. Kelebihan utamanya terdapat pada skenario jika jaringan memiliki banyak subnet IP yang berbeda namun harus melewati infrastruktur switch yang sama</li><li>Berdasarkan Tipe Protokol (Protocol-based VLAN)<br>pada suatu jaringan, ada kemungkinan bahwa traffic yang ada pada switch memiiliki paket data yang berbeda. Metode ini memisahkan VLAN berdasarkan protokol yang berbeda, misalnya protokol IP dimasukkan ke VLAN IP sementara protokol AppleTalk dimasukkan ke VLAN AppleTalk</li><li>Berdasarkan Aplikasi atau Kombinasi (Policy-based / Voice VLAN)<br>ada skenario tertentu misalnya suatu fungsi pada aplikasi tertentu menggunakan panggilan telepon IP/VoIP (misalnya telephone) sementara aplikasi lain menggunakan kombinasi seperti Port + MAC + Jam kerja (misalnya PC), keduanya dipisah ke 2 VLAN berbeda</li></ul><h3>How?</h3><p>Sebagai simulasi, software yang akan digunakan adalah Cisco Packet Tracer. Setelah membuka software tersebut, hal yang diperlukan untuk membuat VLAN adalah 1 switch bertipe 2960–24TT dan 4 end dervice misalnya PC</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/538/1*HNYUq7rDJ98dO4i91ek_IA.png" /></figure><p>Setelah menambahkan beberapa dervice yang diperlukan, langkah selanjutnya adalah menghubungkan end dervice ke switch menggunakan kabel copper straight-through</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/488/1*heGOnAF-bYuLx5zgsLslgA.png" /></figure><p>Setelah menghubungkan semua dervice, langkah selanjutnya adalah membuat VLAN. Untuk membuatnya, cari menu<em> config</em> pada perangkat router. Pada sub menu config, cari <em>VLAN Database. </em>Pada menu tersebut, isi VLAN Number (VLAN ID) dan VLAN Name, jumlah dapat menyesuaikan. Sebagai contoh kira-kira seperti ini :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/745/1*n5TLVYcMipQhuEwEusijAA.png" /></figure><p>Setelah menambahkan VLAN, langkah selanjutnya adalah memasukkan dervice ke dalam VLAN. Pada menu <em>config </em>dan sub menu dibawah <em>interface</em>, masukkan dervice ke dalam VLAN yang sebelumnya telah dibuat, atur semua port jika diperlukan lalu atur port mode menjadi Access. Sebagai contoh kira-kira seperti ini :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/602/1*cY1Yjoe2CujdwNjs-B4iag.png" /></figure><blockquote>Untuk menghubungkan switch ke end dervice, gunakan tipe port access. Sementara untuk menghubungkan antar switch ke switch atau router, gunakan tipe port access trunk</blockquote><p>Untuk melakukan pengujian, atur IPv4 terlebih dahulu. Sebagai contoh kira-kira seperti ini</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/601/1*LpTs81HecIffzhCSvtgIZg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/592/1*s2OkNtMSuimbzgNpzo75uA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/597/1*VjVKr0dz2FItcbw-cZvlEA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/587/1*-dJLXdh4YAoDHQk_or6A4g.png" /></figure><p>Setelah membuat IPv4, pengujian dapat dilakukan. Untuk mengujinya, buka salah satu End dervice (sebagai contoh PC0) yang memiliki command prompt lalu gunakan command ini</p><pre># for devices on the same VLAN<br>ping 192.168.54.2<br><br># for services on different VLANs<br>ping 192.168.54.3<br>ping 192.168.54.4</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/498/1*y1hhRzNlB7dYFkYWUe9yAQ.png" /></figure><blockquote>Pada VLAN yang berbeda, perangkat sama sekali tidak merespon terhadap perangkat yang berbeda VLAN. Dalam kasus tersebut, PC0 masuk ke dalam VLAN1 sementara PC3 dengan IP 192.168.54.3 dan PC4 dengan IP 192.168.54.4 masuk ke dalam VLAN2. Pada command promt yang ada pada perangkat PC0, PC2 merespon karena berada pada VLAN yang sama sementara PC3 dan PC4 tidak merespon karena berada pada VLAN yang berbeda yaitu VLAN2. Ini membuktikan bahwa VLAN dapat memisah jaringan logis secara virtual walaupun perangkat tersebut berada pada 1 jaringan yang sama atau 1 switch yang sama</blockquote><p>References:<br>Module 9 of the Computer Networks Course at Tidar University<br>Cisco Documentation — VLAN Configuration<br>Cisco Catalyst 2960 Configuration Guide<br>Cisco Press — VLAN Basics<br>Claude by Anthropic</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e80cc1bcf691" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Depending on the case - Hadoop and Apache Spark]]></title>
            <link>https://medium.com/@Akmal_Zidan/depending-on-the-case-hadoop-and-apache-spark-d7c3f1b7ce71?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/d7c3f1b7ce71</guid>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Sat, 10 Oct 2026 17:45:56 GMT</pubDate>
            <atom:updated>2026-10-10T17:45:56.265Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NFC9I5qatbzOmn39" /><figcaption>Photo by <a href="https://unsplash.com/@markusspiske?utm_source=medium&amp;utm_medium=referral">Markus Spiske</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Setiap ekosistem atau software umumnya diciptakan untuk menjawab suatu peristiwa. Pada software seperti apache spark dan hadoop berlandaskan pada beberapa kasus yang dapat direkayasa namun tetap menggambarkan kasus yang terjadi di dunia nyata. Kasus-kasus yang digunakan sebagai contoh ini merupakan kasus yang umumnya digunakan untuk mengsimulasikan kejadian yang ada didunia nyata. Namun sebelum itu, sparksession harus dijalankan terlebih dahulu. Untuk menjalankannya cukup gunakan code ini:</p><pre>from pyspark.sql import SparkSession<br>from pyspark.sql.functions import col, sum as spark_sum, avg, count, row_number, when<br>from pyspark.sql.window import Window<br>import numpy as np<br>import pandas as pd<br>import json<br><br>spark = SparkSession.builder \<br>    .appName(&quot;Pertemuan7-StudiKasusTerintegrasi&quot;) \<br>    .master(&quot;local[*]&quot;) \<br>    .getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>print(&quot;SparkSession siap. Versi Spark:&quot;, spark.version)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0dIcaFIPCKfYfUW1ItxsyQ.png" /></figure><h3>First case</h3><p>Kasus pertama menceritakan tentang sebuah perusahaan retail yang memiliki <strong>4 cabang toko</strong> di berbagai kota. Manajemen pusat meminta laporan kinerja triwulan atau 3 bulan terakhir yang mencakup:</p><ol><li>performa penjualan per toko</li><li>produk terlaris di masing-masing toko</li><li>kontribusi tiap manajer cabang</li></ol><p>seluruhnya harus diproses dari data mentah yang tersebar di tiga sumber berbeda. Sebagai permulaan, gunakan code ini untuk membuat datanya:</p><pre>np.random.seed(77)<br><br># SUMBER 1: Data toko/cabang (JSON) — tabel referensi kecil<br>toko_list = [&quot;Toko Magelang&quot;, &quot;Toko Yogyakarta&quot;, &quot;Toko Semarang&quot;, &quot;Toko Solo&quot;]<br>data_toko = [<br>    {&quot;toko_id&quot;: i + 1, &quot;nama_toko&quot;: t, &quot;kota&quot;: t.split()[1], &quot;manager&quot;: np.random.choice([&quot;Rani&quot;, &quot;Joko&quot;, &quot;Sari&quot;, &quot;Bayu&quot;])}<br>    for i, t in enumerate(toko_list)<br>]<br>with open(&quot;data_toko.json&quot;, &quot;w&quot;) as f:<br>    for t in data_toko:<br>        f.write(json.dumps(t) + &quot;\n&quot;)<br><br># SUMBER 2: Data produk (CSV) — tabel referensi kecil<br>data_produk = [<br>    {&quot;product_id&quot;: i, &quot;nama_produk&quot;: f&quot;Produk-{i}&quot;,<br>     &quot;kategori&quot;: np.random.choice([&quot;Elektronik&quot;, &quot;Fashion&quot;, &quot;Makanan&quot;]),<br>     &quot;harga&quot;: int(np.random.choice([50000, 100000, 200000]))}<br>    for i in range(1, 21)<br>]<br>pd.DataFrame(data_produk).to_csv(&quot;data_produk.csv&quot;, index=False)<br><br># SUMBER 3: Data transaksi triwulan (CSV) — data utama, jauh lebih besar<br>n = 5000<br>data_transaksi = pd.DataFrame({<br>    &quot;trx_id&quot;: [f&quot;T{i}&quot; for i in range(n)],<br>    &quot;toko_id&quot;: np.random.randint(1, 5, size=n),<br>    &quot;product_id&quot;: np.random.randint(1, 21, size=n),<br>    &quot;qty&quot;: np.random.randint(1, 6, size=n),<br>})<br>data_transaksi.to_csv(&quot;data_transaksi_triwulan.csv&quot;, index=False)<br><br>print(&quot;Ketiga sumber data berhasil dibuat:&quot;)<br>print(f&quot;- data_toko.json              : {len(data_toko)} baris&quot;)<br>print(f&quot;- data_produk.csv             : {len(data_produk)} baris&quot;)<br>print(f&quot;- data_transaksi_triwulan.csv : {len(data_transaksi)} baris&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/986/1*qnpvieIxRJ5-fpIuZlUz3w.png" /></figure><p>Jika menurut kejadian yang ada di dunia nyata, umumnya dalam menghadapi data berjumlah masif ini, hal yang perlu dilakukan adalah menggunakan direktori hadoop agar data dapat diolah dengan lebih optimal. Untuk melakukannya, cukup gunakan code ini:</p><pre>!hdfs dfs -mkdir -p /user/mahasiswa/pertemuan7/raw<br>!hdfs dfs -put -f data_transaksi_triwulan.csv /user/mahasiswa/pertemuan7/raw/<br>!hdfs dfs -put -f data_toko.json /user/mahasiswa/pertemuan7/raw/<br>!hdfs dfs -put -f data_produk.csv /user/mahasiswa/pertemuan7/raw/<br>!hdfs dfs -ls /user/mahasiswa/pertemuan7/raw</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/943/1*jEfYkTAujmMXvUNT58S2Bw.png" /></figure><h4>Extraction</h4><p>Setelah membaca kode tersebut, langkah selanjutnya adalah membaca file yang telah diupload ke direktori hadoop tersebut. Untuk membacanya cukup gunakan code ini:</p><pre>df_transaksi = spark.read.csv(<br>    &quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/raw/data_transaksi_triwulan.csv&quot;,<br>    header=True, inferSchema=True<br>)<br>df_toko = spark.read.json(&quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/raw/data_toko.json&quot;)<br>df_produk = spark.read.csv(<br>    &quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/raw/data_produk.csv&quot;,<br>    header=True, inferSchema=True<br>)<br><br>print(&quot;Transaksi:&quot;, df_transaksi.count(), &quot;| Toko:&quot;, df_toko.count(), &quot;| Produk:&quot;, df_produk.count())</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/831/1*_u2WQDp_UuPiocin_yztDw.png" /></figure><h4>Transform</h4><p>Pada proses ini, umumnya menjadi inti dari objektif sebuah kasus. Misalnya, untuk mencari performa penjualan per toko, hal yang perlu dilakukan adalah menggabungkan 2 file sekaligus dan memasukkannya ke kolom baru. Hal ini diperlukan karena proses selanjutnya memerlukan data jumlah barang terjual. Untuk menggabungkannya, gunakan code ini:</p><pre>df_gabungan = df_transaksi.join(df_toko, on=&quot;toko_id&quot;, how=&quot;inner&quot;) \<br>                           .join(df_produk, on=&quot;product_id&quot;, how=&quot;inner&quot;)<br><br>df_gabungan = df_gabungan.withColumn(&quot;total_penjualan&quot;, col(&quot;qty&quot;) * col(&quot;harga&quot;))<br>df_gabungan.show(5)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/919/1*YIPPzRAVS0Smtonjd1TDLA.png" /></figure><p>Setelah mencari performa penjualan pertoko, langkah selanjutnya adalah mencari produk terlaris di masing-masing toko. Untuk mencarinya, gunakan code ini:</p><pre># Meringkas total penjualan per kombinasi toko + produk terlebih dahulu<br>ringkasan_produk_toko = df_gabungan.groupBy(&quot;nama_toko&quot;, &quot;nama_produk&quot;).agg(<br>    spark_sum(&quot;total_penjualan&quot;).alias(&quot;total_penjualan&quot;)<br>)<br><br># Menerapkan window function untuk mengambil top-3 produk pada setiap toko<br>window_toko = Window.partitionBy(&quot;nama_toko&quot;).orderBy(col(&quot;total_penjualan&quot;).desc())<br>top3_produk = ringkasan_produk_toko.withColumn(&quot;peringkat&quot;, row_number().over(window_toko)) \<br>                                    .filter(col(&quot;peringkat&quot;) &lt;= 3)<br><br>top3_produk.orderBy(&quot;nama_toko&quot;, &quot;peringkat&quot;).show(20)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*E8zVopWPAWwvXrpiNWhueg.png" /></figure><p>Setelah mencari peforma penjualan pertoko, langkah selanjutnya adalah mencari kontribusi tiap manajer cabang. Ada 2 cara umum yang dapat digunakan untuk mencarinya yaitu dengan menggunakan bahasa yang digunakan sebelumnya dan bahasa SQL. Sebagai contoh, kira-kira seperti ini jika menggunakan bahasa SQL:</p><pre>df_gabungan.createOrReplaceTempView(&quot;gabungan&quot;)<br><br>kontribusi_manager = spark.sql(&#39;&#39;&#39;<br>    SELECT kota, manager, SUM(total_penjualan) AS total_penjualan<br>    FROM gabungan<br>    GROUP BY kota, manager<br>    ORDER BY total_penjualan DESC<br>&#39;&#39;&#39;)<br>kontribusi_manager.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/619/1*LITQ_szDQWCMdFx14tBrAw.png" /></figure><h4>Load</h4><p>Setelah menyelesaikan tahap Transform, tahapan selanjutnya adalah tahap load, yaitu tahapan untuk menyimpan data kembali ke direktori hadoop. Untuk melakukannya, gunakan code ini:</p><pre>!hdfs dfs -mkdir -p /user/mahasiswa/pertemuan7/processed<br><br>df_gabungan.write.mode(&quot;overwrite&quot;).partitionBy(&quot;kategori&quot;).parquet(<br>    &quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/processed/laporan_triwulan&quot;<br>)<br><br>print(&quot;Laporan berhasil disimpan ke HDFS dalam format Parquet, terpartisi per kategori produk.&quot;)<br>!hdfs dfs -ls /user/mahasiswa/pertemuan7/processed/laporan_triwulan</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pcEH7XqJijkI_o6sHfiDHA.png" /></figure><p>Didunia nyata, umumnya setelah mengolah data-data yang diperlukan, data tersebut akan disajikan. Untuk menyajikan datanya sekaligus melakukan verifikasi isinya kira-kira seperti ini</p><pre>df_final = spark.read.parquet(&quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/processed/laporan_triwulan&quot;)<br><br>ringkasan_eksekutif = df_final.groupBy(&quot;nama_toko&quot;, &quot;kota&quot;, &quot;manager&quot;).agg(<br>    spark_sum(&quot;total_penjualan&quot;).alias(&quot;total_penjualan_triwulan&quot;),<br>    count(&quot;trx_id&quot;).alias(&quot;jumlah_transaksi&quot;),<br>    avg(&quot;total_penjualan&quot;).alias(&quot;rata_rata_nilai_transaksi&quot;)<br>).orderBy(col(&quot;total_penjualan_triwulan&quot;).desc())<br><br>ringkasan_eksekutif.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/927/1*tX7nq-UVRjurwsANZUgc6Q.png" /></figure><h3>Second case</h3><p>Setelah mengerjakan kasus pertama, kasus kedua datang sebagai lanjutan dari kasus pertama. Kasus kedua meminta beberapa hal seperti</p><ol><li>Menampilkan <strong>kategori produk</strong> dengan total qty (jumlah unit terjual, bukan nilai rupiah) tertinggi secara keseluruhan</li><li>Menggunakan window function, tentukan <strong>toko dengan penjualan tertinggi</strong> untuk <strong>masing-masing kategori produk</strong> (top-1 saja, gunakan row_number())</li><li>Simpan hasil ringkasan_eksekutif ke HDFS sebagai Parquet <strong>tanpa partisi</strong>, pada path /user/mahasiswa/latihan7/ringkasan_eksekutif</li></ol><p>Sebagai permulaan, jalankan kembali sparksession dan baca kembali data yang sebelumnya telah dibuat.</p><pre># Persiapan ulang untuk latihan<br>spark = SparkSession.builder.appName(&quot;Latihan7&quot;).master(&quot;local[*]&quot;).getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>df_transaksi = spark.read.csv(&quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/raw/data_transaksi_triwulan.csv&quot;, header=True, inferSchema=True)<br>df_toko = spark.read.json(&quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/raw/data_toko.json&quot;)<br>df_produk = spark.read.csv(&quot;hdfs://localhost:9000/user/mahasiswa/pertemuan7/raw/data_produk.csv&quot;, header=True, inferSchema=True)<br>df_gabungan = df_transaksi.join(df_toko, on=&quot;toko_id&quot;).join(df_produk, on=&quot;product_id&quot;)<br>df_gabungan = df_gabungan.withColumn(&quot;total_penjualan&quot;, col(&quot;qty&quot;) * col(&quot;harga&quot;))<br>print(&quot;Siap untuk latihan. Total baris:&quot;, df_gabungan.count())</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Dvn2MdtWS4gbkOvUK7JpaQ.png" /></figure><p>Untuk menjawab tugas pertama yaitu menapilkan kategori produk dengan syarat yang sudah disebutkan, cukup gunakan code ini:</p><pre>from pyspark.sql.functions import sum, desc<br><br>df_tertinggi = df_gabungan.groupBy(&quot;kategori&quot;) \<br>    .agg(sum(&quot;qty&quot;).alias(&quot;total_qty&quot;)) \<br>    .orderBy(desc(&quot;total_qty&quot;))<br><br>df_tertinggi.show(1)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/469/1*gmPrRytVtjqoAVZQIjuzoQ.png" /></figure><p>Setelah menjawab tugas pertama, tugas kedua sudah dapat dikerjakan. Untuk menentukan toko dengan penjualan tertinggi kira-kira seperti ini:</p><pre>from pyspark.sql.functions import col, sum, desc, row_number<br>from pyspark.sql.window import Window<br><br>df_sales_toko = df_gabungan.groupBy(&quot;kategori&quot;, &quot;nama_toko&quot;) \<br>    .agg(sum(&quot;total_penjualan&quot;).alias(&quot;total_sales&quot;))<br><br>windowSpec = Window.partitionBy(&quot;kategori&quot;).orderBy(desc(&quot;total_sales&quot;))<br><br>df_top_toko = df_sales_toko.withColumn(&quot;ranking&quot;, row_number().over(windowSpec)) \<br>    .filter(col(&quot;ranking&quot;) == 1) \<br>    .drop(&quot;ranking&quot;) <br><br>df_top_toko.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/670/1*JOPK49D-fuyG8mRpLKkrhg.png" /></figure><p>Setelah menjawab tugas kedua, tugas ketiga sudah dapat dikerjakan. Untuk menyimpan data dengan syarat yang sudah ditentukan, gunakan code ini:</p><pre>from pyspark.sql.functions import col, sum, desc, row_number<br>from pyspark.sql.window import Window<br><br>df_kategori_terlaris = df_gabungan.groupBy(&quot;kategori&quot;) \<br>    .agg(sum(&quot;qty&quot;).alias(&quot;total_qty_terjual&quot;)) \<br>    .orderBy(desc(&quot;total_qty_terjual&quot;))<br><br>df_kategori_terlaris.show(1)<br><br>df_sales_toko = df_gabungan.groupBy(&quot;kategori&quot;, &quot;nama_toko&quot;) \<br>    .agg(sum(&quot;total_penjualan&quot;).alias(&quot;total_pendapatan&quot;))<br><br>windowSpec = Window.partitionBy(&quot;kategori&quot;).orderBy(desc(&quot;total_pendapatan&quot;))<br><br>df_top_toko = df_sales_toko.withColumn(&quot;ranking&quot;, row_number().over(windowSpec)) \<br>    .filter(col(&quot;ranking&quot;) == 1) \<br>    .drop(&quot;ranking&quot;)<br><br>df_top_toko.show()<br><br>!hdfs dfs -mkdir -p /user/mahasiswa/latihan7/ringkasan_eksekutif<br><br>df_top_toko.write.mode(&quot;overwrite&quot;).partitionBy(&quot;kategori&quot;).parquet(<br>    &quot;hdfs://localhost:9000/user/mahasiswa/latihan7/ringkasan_eksekutif&quot;<br>)<br><br>print(&quot;Laporan berhasil disimpan ke HDFS dalam format Parquet, terpartisi per kategori produk.&quot;)<br>!hdfs dfs -ls /user/mahasiswa/latihan7/ringkasan_eksekutif</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/899/1*drOH5nCHyQ_zMyP44F6rvQ.png" /></figure><p>Secara teknis, seluruh proses tersebut berjalan dalam sebuah kombinasi yang umum didunia big data. Kombinasi itu melibatkan HDFS sebagai penyimpanan data, parquet sebagai format dari data-data yang disimpan dan spark sebagai mesin pengolah data-data tersebut. Dalam skenario tertentu misalnya menghitung rata-rata data yang ada pada kolom, terdapat teknik seperti <em>Columnar Projection</em>. Teknik ini berguna untuk mempercepat pengambilan data, alih-alih mengambil banyak kolom yang tidak akan dipakai, Spark cukup mengambil 1 kolom saja karena format parquet mendukung hal tersebut. Kasus lain seperti menulis suatu query tertentu, spark akan mulai mengabaikan data yang tidak relevan dengan query yang dijalankan, teknik ini biasa disebut <em>Predicate Pushdown</em>. Kasus lain lagi seperti network bottleneck juga dapat diatasi dengan mengirim kode komputasi langsung ke server HDFS tempat data berada, teknik ini biasa disebut dengan <em>Data Locality</em>.</p><h3>Third case</h3><p>Kasus ketiga merupakan kasus yang berbeda dari kasus sebelumnya. Kasus ketiga meminta</p><ol><li>Gabungkan ketiga tabel, tambahkan kolom total_penjualan (qty x harga).</li><li>Tentukan <strong>top-2 menu terlaris</strong> (berdasarkan total_penjualan) di <strong>setiap cabang</strong>, gunakan row_number().</li><li>Menggunakan <strong>Spark SQL murni</strong>, tampilkan total penjualan per kepala_barista, diurutkan dari tertinggi</li></ol><p>Sebelum mengerjakan tugas tersebut, jalankan kode ini terlebih dahulu</p><pre>import numpy as np<br>import pandas as pd<br>import json<br><br>np.random.seed(123)<br><br># Sumber 1: Data cabang (JSON)<br>cabang_list = [&quot;Kopi Nusantara Magelang&quot;, &quot;Kopi Nusantara Yogyakarta&quot;, &quot;Kopi Nusantara Semarang&quot;]<br>data_cabang = [<br>    {&quot;cabang_id&quot;: i + 1, &quot;nama_cabang&quot;: c, &quot;kota&quot;: c.split()[-1],<br>     &quot;kepala_barista&quot;: np.random.choice([&quot;Wulan&quot;, &quot;Reza&quot;, &quot;Nadia&quot;])}<br>    for i, c in enumerate(cabang_list)<br>]<br>with open(&quot;tugas7_cabang.json&quot;, &quot;w&quot;) as f:<br>    for c in data_cabang:<br>        f.write(json.dumps(c) + &quot;\n&quot;)<br><br># Sumber 2: Data menu (CSV)<br>menu_list = [<br>    {&quot;menu_id&quot;: i, &quot;nama_menu&quot;: f&quot;Menu-{i}&quot;,<br>     &quot;kategori_menu&quot;: np.random.choice([&quot;Kopi&quot;, &quot;Non-Kopi&quot;, &quot;Makanan Ringan&quot;]),<br>     &quot;harga&quot;: int(np.random.choice([18000, 22000, 25000, 30000, 35000]))}<br>    for i in range(1, 16)<br>]<br>pd.DataFrame(menu_list).to_csv(&quot;tugas7_menu.csv&quot;, index=False)<br><br># Sumber 3: Data transaksi (CSV) — data utama<br>n = 4000<br>data_transaksi_tugas7 = pd.DataFrame({<br>    &quot;trx_id&quot;: [f&quot;KN{i}&quot; for i in range(n)],<br>    &quot;cabang_id&quot;: np.random.randint(1, 4, size=n),<br>    &quot;menu_id&quot;: np.random.randint(1, 16, size=n),<br>    &quot;qty&quot;: np.random.randint(1, 5, size=n),<br>})<br>data_transaksi_tugas7.to_csv(&quot;tugas7_transaksi.csv&quot;, index=False)<br><br>!hdfs dfs -mkdir -p /user/mahasiswa/tugas7/raw<br>!hdfs dfs -put -f tugas7_transaksi.csv /user/mahasiswa/tugas7/raw/<br>!hdfs dfs -put -f tugas7_cabang.json /user/mahasiswa/tugas7/raw/<br>!hdfs dfs -put -f tugas7_menu.csv /user/mahasiswa/tugas7/raw/<br><br>print(&quot;Ketiga sumber data siap &amp; data transaksi sudah diunggah ke HDFS.&quot;)<br>print(f&quot;- Cabang: {len(data_cabang)} | Menu: {len(menu_list)} | Transaksi: {n}&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/798/1*j2j_v3CjGT4I_3bj-WviTQ.png" /></figure><h4>Load</h4><p>Tahap pertama yang dapat dilakukan adalah membaca data tersebut langsung dari HDFSnya. Untuk melakukannya kira-kira seperti ini:</p><pre>from pyspark.sql import SparkSession<br>from pyspark.sql.functions import col<br><br>spark = SparkSession.builder.appName(&quot;Tugas7_SparkSQL&quot;).getOrCreate()<br><br>df_cabang = spark.read.json(&quot;hdfs://localhost:9000/user/mahasiswa/tugas7/raw/tugas7_cabang.json&quot;)<br><br>df_menu = spark.read.csv(&quot;hdfs://localhost:9000/user/mahasiswa/tugas7/raw/tugas7_menu.csv&quot;, header=True, inferSchema=True)<br>df_transaksi = spark.read.csv(&quot;hdfs://localhost:9000/user/mahasiswa/tugas7/raw/tugas7_transaksi.csv&quot;, header=True, inferSchema=True)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QwiXQ-etYgTqvI-NvH0KXw.png" /></figure><h4>Transform</h4><p>Setelah membaca data tersebut, tahap selanjutnya adalah menggabungkan ketiga data lalu menambahkan kolom baru yang akan digunakan datanya untuk proses selanjutnya. Untuk menjawabnya kira-kira seperti ini:</p><pre>df_gabungan = df_transaksi \<br>    .join(df_cabang, on=&quot;cabang_id&quot;, how=&quot;inner&quot;) \<br>    .join(df_menu, on=&quot;menu_id&quot;, how=&quot;inner&quot;)<br><br>df_final = df_gabungan.withColumn(&quot;total_penjualan&quot;, col(&quot;qty&quot;) * col(&quot;harga&quot;))<br><br>df_final.show(10)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1012/1*oIGe5H4ka8bvDZCxR-QxsA.png" /></figure><p>Setelah menambahkan kolom baru, langkah selanjutnya adalah menententukan <strong>top-2 menu terlaris</strong> (berdasarkan total_penjualan) di <strong>setiap cabang</strong>, gunakan row_number(). Untuk melakukannya, gunakan code ini:</p><pre>from pyspark.sql.window import Window<br>from pyspark.sql.functions import col, sum, row_number<br><br>df_agregasi = df_final.groupBy(&quot;nama_cabang&quot;, &quot;nama_menu&quot;) \<br>    .agg(sum(&quot;total_penjualan&quot;).alias(&quot;total_penjualan_menu&quot;))<br><br>window_spec = Window.partitionBy(&quot;nama_cabang&quot;).orderBy(col(&quot;total_penjualan_menu&quot;).desc())<br><br>df_ranked = df_agregasi.withColumn(&quot;rank&quot;, row_number().over(window_spec))<br><br>df_top2_menu = df_ranked.filter(col(&quot;rank&quot;) &lt;= 2)<br><br>df_top2_menu.show(truncate=False)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/734/1*EEgO9QbOp-ia7UsZ6jxfsQ.png" /></figure><p>Setelah menentukan menu terlaris, langkah selanjutnya adalah menampilkan total penjualan per kepala_barista, diurutkan dari tertinggi. Untuk melakukannya kira-kira seperti ini:</p><pre>from pyspark.sql.functions import col, sum<br><br>df_barista_sales = df_final.groupBy(&quot;kepala_barista&quot;) \<br>    .agg(sum(&quot;total_penjualan&quot;).alias(&quot;total_penjualan_barista&quot;)) \<br>    .orderBy(col(&quot;total_penjualan_barista&quot;).desc())<br><br>df_barista_sales.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/559/1*ACBviFMJ-gac3pNtnvFseg.png" /></figure><h4>Load</h4><p>Setelah melakukan beberapa pengolahan tersebut, langkah selanjutnya adalah menyimpan data tersebut. Lebih detailnya adalah menyimpan data hasil dari menggabungkan ketiga tabel dan menambahkan kolom total_penjualan setelah itu lakukan verifikasi kembali. Untuk melakukannya kira-kira seperti ini:</p><pre>!hdfs dfs -mkdir -p /user/amba/t7/processed/laporan<br>output_path = &quot;hdfs://localhost:9000/user/amba/t7/processed/laporan&quot;<br><br>df_final.write \<br>    .partitionBy(&quot;kategori_menu&quot;) \<br>    .mode(&quot;overwrite&quot;) \<br>    .parquet(output_path)<br><br>df_verify = spark.read.parquet(output_path)<br><br>df_verify.printSchema() <br><br>df_verify.show(10)<br><br>print(f&quot;Total baris data yang disimpan: {df_verify.count()}&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1020/1*Ulb1eJlbyvmINKU8vPUu_A.png" /></figure><p>Setelah memverifikasi data tersebut langkah selanjutnya adalah mencari cabang mana yang berkinerja terbaik, menu apa yang sebaiknya dipromosikan lebih gencar di cabang dengan kinerja terlemah. Untuk melakukannya, cukup gunakan code ini:</p><pre>from pyspark.sql.functions import sum, count, avg, round<br>from pyspark.sql.functions import col, sum<br><br>df_ringkasan_cabang = df_final.groupBy(&quot;nama_cabang&quot;) \<br>    .agg(<br>        sum(&quot;total_penjualan&quot;).alias(&quot;total_penjualan&quot;),<br>        count(&quot;trx_id&quot;).alias(&quot;jumlah_transaksi&quot;),<br>        round(avg(&quot;total_penjualan&quot;), 2).alias(&quot;rata_rata_transaksi&quot;)<br>    )<br><br>df_ringkasan_cabang.show(truncate=False)<br><br><br>df_tidak_laku_jogja = df_final.filter(col(&quot;nama_cabang&quot;) == &quot;Kopi Nusantara Yogyakarta&quot;) \<br>    .groupBy(&quot;nama_menu&quot;) \<br>    .agg(<br>        sum(&quot;qty&quot;).alias(&quot;total_kuantitas_terjual&quot;),<br>        sum(&quot;total_penjualan&quot;).alias(&quot;total_pendapatan&quot;)<br>    ) \<br>    .orderBy(col(&quot;total_kuantitas_terjual&quot;).asc())<br><br>df_tidak_laku_jogja.show(1)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/759/1*S1O5ulYEIxTQkKZqG_bd7Q.png" /></figure><p>Dari ketiga cabang yang terdaftar pada file bernama tugas7_cabang.json , tugas7_transaksi.csv, tugas7_menu.csv, cabang dengan kinerja terbaik merupakan cabang kopi nusantara yang berada di kota semarang, cabang kopi nusantara yang berada di kota semarang dinilai menjadi cabang dengan kinerja terbaik karena hal tersebut dinilai dari total penjualan yang cabang tersebut dapat diraih.</p><p>Jika cabang daru kopi nusantara yang berada di semarang merupakan cabang dengan kinerja terbaik, maka cabang kopi nusantara yang berada di kota yogyakarta merupakan cabang dengan kinerja paling buruk. Cabang inni dinilai menjadi cabang yang paling buruk karena total penjualannya lebih rendah dari cabang lain. Pada cabang ini,menu yang perlu dipromosikan dengan lebih gencar merupakan menu-13. Alasan menu tersebut dinilai perlu dipromosikan lebih gentar karena menu tersebut hanya memiliki kuantitas terjual sebesar 181. Walaupun selisihnya tidak terlalu besar jika dibandingkan dengan menu lain, tetapi tidak dapat dipungkiri kalau menu tersebut memang berada di titik tidak selaris menu yang lain walau perbedaanya hanya sedikit.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d7c3f1b7ce71" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to make a topology]]></title>
            <link>https://medium.com/@Akmal_Zidan/how-to-make-a-topology-9c3a5a7361b8?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/9c3a5a7361b8</guid>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Tue, 06 Oct 2026 02:30:31 GMT</pubDate>
            <atom:updated>2026-10-06T02:35:23.451Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*aMcgX56T5KJzvL3F" /><figcaption>Photo by <a href="https://unsplash.com/@albertstoynov?utm_source=medium&amp;utm_medium=referral">Albert Stoynov</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>How?</h3><p>Sebelum membuat topologi, ada beberapa dervice yang diperlukan. Dervice tersebut terbagi menjadi 2 kelompok yaitu kelompok inside dan kelompok outside.</p><h4>Inside</h4><p>Kelompok inside merupakan kelompok yang memiliki wireless jaringan dan bersifat lokal. Jaringan ini dinamakan inside menurut sudut pandang router utama, dan juga sifatnya yang lokal dan berada dibawah kendali misalnya jaringan yang ada di sebuah rumah, kantor, sekolah dan lainnya. Untuk dervice yang diperlukan adalah router model 2911 sebagai router utama, 1 switch dengan model 2960, 1 wireless router bertipe WRT300N, beberapa end dervice seperti PC dan Ponsel.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/705/1*tTLXB6LFIClZYfcS4F-a0w.png" /></figure><h4>Outside</h4><p>Kelompok selanjutnya adalah kelompok outside. Kelompok ini dinamakan outside karena berada di luar kendali dan berstatus jaringan publik. Untuk dervice yag digunakan adalah 1 Router dengan model 2911 dan 1 server End dervice.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/528/1*vDdfVmadJGBhT8fEo-OwIQ.png" /></figure><h3>Connect them</h3><p>Setelah memilih dervice yang digunakan, langkah selanjutnya adalah menghubungkan tiap dervice yang sudah ada.</p><h4>Create a topology for the Inside group</h4><p>Sebagai permulaan, hubungkan tiap dervice yang berada di kelompok inside. Dervice pertama yang dapat dihubungkan adalah Router lewat port GigabitEthernet0/0 dan Switch lewat port FastEthernet0/1 menggunakan kabel Copper Straight-Through</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/172/1*c8NQRvs5bFjHp3nGdlJCeA.png" /></figure><p>Setelah menghubungkan kedua dervice, langkah selanjutnya adalah menghubungkan Switch lewat port FastEthernet0/2 ke Wireless Router lewat port Ethernet1 menggunakan kabel Copper Straight-Through</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/549/1*BFkITFJizcbalUd1FU_01A.png" /></figure><p>Setelah menghubungkan 3 dervice tersebut, langkah selanjutnya adalah menghubungkan Switch lewat port FastEthernet 0/3 dan selanjutnya dengan perangkat End dervice seperti PC lewat port FastEthernet0 menggunakan kabel Copper Straight-Through, untuk end dervice lain seperti Laptop dan Ponsel cukup gunakan Wireless</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/678/1*VwZt4nNEdTDIkKcFWKkMhA.png" /></figure><h4>Connect the rest</h4><p>Setelah menghubungkan tiap dervice yang ada pada kelompok inside, langkah selanjutnya adalah menghubungkan dervice yang ada pada kelompok outside lalu hubungkan 2 kelompok yang ada. Hubungkan server publik lewat port FastEthernet0 ke router lewat port GigabitEthernet0/1 menggunakan kabel Copper Cross-Over.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/412/1*ALFBKmuSJqnexKMD3SbzTw.png" /></figure><p>Setelah menghubungkan 2 dervice tersebut, langkah selanjutnya adalah menghubungkan kedua kelompok lewat perantara router. Hubungkan router yang ada di kelompok outside lewat port GigabitEthernet0/0 dengan router yang ada pada kelompok inside lewat port GigabitEthernet0/1 menggunakan kabel Copper Cross-Over.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*thQ7kgCAtoW99V5Vnx51vw.png" /></figure><h3>Set the IP</h3><p>Setelah menghubungkan tiap dervice yang diperlukan, langkah selanjutnya adalah mengatur IP address.</p><h4>Inside</h4><p>Sebagai permulaan, IP address yang bisa disetel adalah milik kelompok inside. router yang ada pada kelompok inside akan diatur sebagai router utama atau main router. Pada port GigabitEthernet0/0, atur IP address sesuai dengan selera, IP address yang ada pada port ini akan menjadi IP gateway dari kelompok inside. Sebagai contoh kira-kira seperti ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UU_qoAduEwBZboOXDNP9sg.png" /></figure><blockquote>jangan lupa untuk mengaktifkan port status</blockquote><p>Setelah mengatur IP milik router utama, langkah selanjutnya adalah mengatur IP address yang ada pada wireless router dan mengubah konfigurasi dari DHCP menjadi Static, ini berfungsi agar wireless router hanya sebagai Access point saja dan atur IP address sesuai selera namun tetap dalam aturan. Sebagai contoh kira-kira seperti ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H-egXWuGQbubqz_s_X_KLg.png" /></figure><p>Setelah mengatur IP address, langkah selanjutnya adalah mengubah setelah untuk mematikan DHCP server dan mengubah internet Connection Type menjadi auto configuration agar wireless router ini berubah menjadi access point</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CQ95KR2Pcn3BJkuEjYoBgw.png" /></figure><p>Setelah mengatur wireless router, langkah selanjutnya adalah mengatur IP yang ada end dervice dimulai dari PC. Untuk caranya dinilai mudah yaitu pada port FastEthernet0, ubah menjadi DHCP</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*E9d4TVOP9ZQGvTZyf1Yb4A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jwiM-AggfNttMyhkJ-Kw9g.png" /></figure><p>Setelah mengatur end dervice jenis PC, langkah selanjutnya adalah mengatur end dervice jenis laptop. Karena secara default laptop tidak memiliki kemampuan wireless maka yang perlu dilakukan adalah menganti modulnya menjadi WPC300N lalu ubah ubah menjadi DHCP</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/639/1*4MBdy4ohxJSiL9yNWAwMCQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d6On2loT_agZW5xm2zJaPQ.png" /></figure><h4>Set the IP for the rest of the device</h4><p>Setelah mengatur IP address untuk kelompok inside, langkah selanjutnya adalah mengatur IP address milik router ISP dan server publik. Pada server publik, masukan IP address ke port FastEthernet0 dan atur IP gatewaynya yang berada di <em>settings</em>, sebagai contoh kira-kira seperti ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HlqjHKyE3OATs8Qz7rABFA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/484/1*_-0i5YEZANgtD-BTmOj_Kg.png" /></figure><p>Setelah mengatur server publik, langkah selanjutnya adalah mengatur router ISP. Pada port GigabitEthernet0/1, ubah IP address sesuai dengan gateway yang ada pada server publik, sebagai contoh kira-kira seperti ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A-TVQX_cVskuxC3E_jf0cQ.png" /></figure><p>Setelah mengatur IP address agar router ISP dan server publik dapat terhubung, langkah selanjutnya adalah menghubungkan router utama yang ada pada kelompok inside dengan router ISP yang ada pada kelompok outside. Di router utama pada port GigabitEthernet0/1, atur IP address sesuai selera. Sebagai contoh kira-kira seperti ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CPiK_YgWR8gcbaH5CF2F1Q.png" /></figure><p>Lalu di router ISP pada port GigabitEthernet0/0, atur IP address sesuai selera namun tetap menyesuaikan. Sebagai contoh kira-kira seperti ini:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hjUGRCW7g6cL-CdEQjn8qg.png" /></figure><h3>Set the password</h3><p>Ada beberapa hal yang akan diatur khususnya pada dervice wireless router yaitu mengatur SSID, password dan enkripsi. Untuk melakukannya buka menu GUI pada router dan cari sub menu <em>basic wireless</em> yang ada pada menu <em>wireless.</em> Dibagian <em>Network Name(SSID)</em> adalah nama dari jaringan tersebut</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K2DWMjWEtzl-u8yG0YGWiw.png" /></figure><p>Setelah mengatur nama, langkah selanjutnya adalah mengatur security. Pada menu yang sama, buka sub menu <em>Wireless Security </em>dan ubah security mode menjadi WPA2 Personal dengan enkripsi AES dan Passphrase sebagai password.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rirw-1IsQ4P4jqaISx_sKw.png" /></figure><h4>Connect the wireless device</h4><p>Setelah menyetel wireless router, langkah selanjutnya adalah menghubungkan tiap dervice yang menggunakan jaringan wireless. Untuk melakukannya, cukup buka menu <em>wireless0</em> pada tiap dervice dan setel SSID, autentikasi dan password sesuai dengan wireless router</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/953/1*6yQujIQq5bxrWbqkw75xNg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/947/1*Idr6_I_RtMXle_b8bthPyg.png" /></figure><h3>Setting the default route</h3><p>Tujuan mengatur default router (default gateway) adalah untuk menentukan jalur keluar default bagi lalu lintas jaringan dari perangkat ke jaringan lain di luar jaringan lokal (misalnya ke internet). Untuk mengaturnya, buka menu <em>Config </em>pada router utama, pada sub menu static isi <em>Network, mask </em>dan<em> next hop </em>sesuai dengan IP yang menghubungkan antara router utama dengan router ISP</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/964/1*4nlSEQzUlmlEiF3LACl7sw.png" /></figure><h3>Setting up a DHCP pool and NAT</h3><p>Untuk menyetel DHCP pool dan NAT, yang harus dilakukan adalah menggunakan menu CLI. Untuk menyetelnya, buka menu CLI pada router utama dan gunakan command ini</p><pre>configure terminal<br><br>interface gigabitEthernet0/0<br> ip nat inside<br>exit<br><br>interface gigabitEthernet0/1<br> ip nat outside<br>exit<br><br>ip dhcp excluded-address 192.168.54.1 192.168.54.10<br>ip dhcp pool LAN<br> network 192.168.54.0 255.255.255.0<br> default-router 192.168.54.1<br> dns-server 8.8.8.8<br>exit<br><br>access-list 1 permit 192.168.54.0 0.0.0.255<br>ip nat inside source list 1 interface gigabitEthernet0/1 overload<br><br>end<br>write memory</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/683/1*9_4G2zV9YtzonIwKNP745g.png" /></figure><p>Setelah selesai, lakukan pengujian dengan menggunakan command ini</p><pre>show running-config | section dhcp<br>show ip nat translations<br>show running-config | include nat</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/585/1*x_lEElrwpqTYeWrOrYSJ9Q.png" /></figure><blockquote>Kesimpulannya, belajar membuat topologi dinilai sebagai praktik dalam membuat ekosistem yang saling terhubung</blockquote><p>Referensi:<br>Computer Network Course Lab Module at Tidar University</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9c3a5a7361b8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tried parquet and JSON formats]]></title>
            <link>https://medium.com/@Akmal_Zidan/tried-parquet-and-json-formats-c76665aab800?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/c76665aab800</guid>
            <category><![CDATA[pyspark]]></category>
            <category><![CDATA[big-data]]></category>
            <category><![CDATA[hadoop]]></category>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Thu, 01 Oct 2026 04:17:23 GMT</pubDate>
            <atom:updated>2026-10-01T04:17:23.511Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YhyE_zfPDp4MJ4fV" /><figcaption>Photo by <a href="https://unsplash.com/@dawson2406?utm_source=medium&amp;utm_medium=referral">Stephen Dawson</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>What is that?</h3><p>Apache Parquet, merupakan sebuah format penyimpanan file open-source yang beorientasi pada kolom. Format ini dirancang khusus untuk menyimpan dan memproses data dalam jumlah yang masif namun tetap mempertahankan kecepatan dan efisien yang tinggi. Untuk mencobanya, jalankan code ini terlebih dahulu</p><pre>from pyspark.sql import SparkSession<br>from pyspark.sql.functions import col, sum as spark_sum, avg, count<br>import numpy as np<br>import pandas as pd<br>import os<br><br>spark = SparkSession.builder \<br>    .appName(&quot;Pertemuan6-ParquetETL&quot;) \<br>    .master(&quot;local[*]&quot;) \<br>    .getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>print(&quot;SparkSession siap. Versi Spark:&quot;, spark.version)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*lO5thfqbdvhDuCKZ9wfbGw.png" /></figure><h4>Compare it with .CSV</h4><p>Setelah mengetahui secara singkat seperti apa Apache Parquet secara singkat, hal yang dapat dicoba untuk pertama kali adalah membandingkannya dengan file format csv. Hal yang diperlukan untuk membandingkan CSV dan Parquet adalah dengan membuat dataset yang cukup besar, untuk membuatnya kira-kira gunakan code seperti ini</p><pre>np.random.seed(11)<br>n = 20000<br>data_besar = {<br>    &quot;order_id&quot;: [f&quot;O{i}&quot; for i in range(n)],<br>    &quot;customer_id&quot;: np.random.randint(1, 21, size=n),<br>    &quot;kategori&quot;: np.random.choice([&quot;Elektronik&quot;, &quot;Fashion&quot;, &quot;Makanan&quot;, &quot;Rumah Tangga&quot;, &quot;Kesehatan&quot;], size=n),<br>    &quot;kota&quot;: np.random.choice([&quot;Magelang&quot;, &quot;Semarang&quot;, &quot;Solo&quot;, &quot;Yogyakarta&quot;, &quot;Purworejo&quot;], size=n),<br>    &quot;metode_pembayaran&quot;: np.random.choice([&quot;Transfer Bank&quot;, &quot;E-Wallet&quot;, &quot;COD&quot;, &quot;Kartu Kredit&quot;], size=n),<br>    &quot;pendapatan&quot;: np.random.randint(50000, 500000, size=n),<br>}<br>pd.DataFrame(data_besar).to_csv(&quot;data_transaksi_besar.csv&quot;, index=False)<br><br>csv_size = os.path.getsize(&quot;data_transaksi_besar.csv&quot;)<br>print(f&quot;Ukuran CSV: {csv_size:,} bytes ({csv_size/1024:.1f} KB) untuk {n:,} baris&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/773/1*RZS8DuEVwjPGMGq1rXT7jg.png" /></figure><p>Terlihat pada code code tersebut, di perlihatkan bahwa ukuran dari CSV tersebut. Setelah menjalankan kode tersebut, langkah selanjutnya adalah menguji ukuran file format Parquet. Untuk mencobanya cukup gunakan code ini</p><pre>df_besar = spark.read.csv(&quot;data_transaksi_besar.csv&quot;, header=True, inferSchema=True)<br>df_besar.write.mode(&quot;overwrite&quot;).parquet(&quot;data_transaksi_besar_parquet&quot;)<br><br>parquet_size = sum(<br>    os.path.getsize(os.path.join(dp, f))<br>    for dp, dn, fn in os.walk(&quot;data_transaksi_besar_parquet&quot;)<br>    for f in fn if f.endswith(&quot;.parquet&quot;)<br>)<br><br>print(f&quot;Ukuran CSV      : {csv_size:,} bytes ({csv_size/1024:.1f} KB)&quot;)<br>print(f&quot;Ukuran Parquet  : {parquet_size:,} bytes ({parquet_size/1024:.1f} KB)&quot;)<br>print(f&quot;Parquet {(1 - parquet_size/csv_size)*100:.1f}% lebih kecil dibanding CSV&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/627/1*ka6JRTp0K0FFfldGFYMfDw.png" /></figure><h4>How?</h4><p>Secara konsep, Parquet bekerja dengan cara membuat folder secara otomatis, Parquet dapat mempartisi data berdasarkan nilai kolom tertentu. Artinya saat menyimpan data dengan format Parquet, user dapat memilih satu atau kolom untuk dijadikan dasar partisi lalu spark akan secara otomatis membuat sub folder fisik terpisah untuk setiap nilai unik pada kolom tersebut. Hal ini menyebabkan data lebih cepat untuk dicari ketika user melakukan penyaringan data berdasarkan kolom yang dipartisi. Kelebihan lain seperti Spark dapat menghindari momen dimana pembacaan penuh, ini karena kecepatan ini ada karena spark dapat langsung menuju ke folder yang relevan dengan filter tanpa perlu membaca dan memindai seluruh isi dataset secara keseluruhan.</p><p>Contoh kasusnya ketika mempartisi sebuah dataset dengan triliunan baris berdasarkan kolom tertentu, sistem akan membuat folder terpisah dengan nama tertentu tergantung pada data yang disimpan.</p><pre>df_besar.write.mode(&quot;overwrite&quot;).partitionBy(&quot;kota&quot;).parquet(&quot;data_transaksi_partisi_kota&quot;)<br><br>!ls data_transaksi_partisi_kota</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/962/1*dKD3Ku3YfuuLutTXRlB5Ow.png" /></figure><p>Code tersebut adalah salah satu contoh yang cukup sempurna untuk memperagakan cara kerja Parquet. Ketika code tersebut dijalankan, spark membuat folder berdasarkan berdasarkan kota=magelang, kota=semarang dan lainnya sehingga dalam skenario seperti mencari data magelang, Spark hanya perlu mencari data dengan nama yang sesuai tanpa perlu mengecek 1 persatu folder.</p><h3>Other data types?</h3><p>Selain tipe data Parquet, big data secara umum cukup sering melibatkan format JSON. Format ini biasanya ada pada API, log aplikasi atau data NoSQL. Untuk mencobanya, jalankan code ini</p><pre>import json<br><br>np.random.seed(21)<br>pelanggan = [<br>    {<br>        &quot;customer_id&quot;: i,<br>        &quot;nama&quot;: f&quot;Pelanggan{i}&quot;,<br>        &quot;membership&quot;: np.random.choice([&quot;Silver&quot;, &quot;Gold&quot;, &quot;Platinum&quot;]),<br>        &quot;kota_domisili&quot;: np.random.choice([&quot;Magelang&quot;, &quot;Semarang&quot;, &quot;Solo&quot;, &quot;Yogyakarta&quot;, &quot;Purworejo&quot;])<br>    }<br>    for i in range(1, 21)<br>]<br><br>with open(&quot;data_pelanggan.json&quot;, &quot;w&quot;) as f:<br>    for p in pelanggan:<br>        f.write(json.dumps(p) + &quot;\n&quot;)<br><br>print(&quot;Berkas data_pelanggan.json berhasil dibuat (format JSON Lines).&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1AgGFQDKaYIjO3qj9rIknQ.png" /></figure><p>Setelah berhasil membuat dataset yang menggunakan format JSON, langkah selanjutnya adalah mencoba membaca format data tersebut. Untuk mencobanya, gunakan code seperti ini</p><pre>df_pelanggan = spark.read.json(&quot;data_pelanggan.json&quot;)<br>df_pelanggan.printSchema()<br>df_pelanggan.show(5)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/884/1*akLLZasTAA9ayeCPe8TmPA.png" /></figure><h3>Buld the pipeline?</h3><p>Pada proses membuat pipeline, terdapat beberapa proses antara lain</p><h4>Extract</h4><p>Proses ini berfungsi untuk mengambil data mentah dari sumbernya. Pada contoh ini, data diambil dari 2 sumber berbeda lalu dibaca dengan proses .count(). Sebagai contoh, kira-kira seperti ini</p><pre>df_transaksi_etl = spark.read.csv(&quot;data_transaksi_besar.csv&quot;, header=True, inferSchema=True)<br>df_pelanggan_etl = spark.read.json(&quot;data_pelanggan.json&quot;)<br><br>print(&quot;Data transaksi:&quot;, df_transaksi_etl.count(), &quot;baris&quot;)<br>print(&quot;Data pelanggan:&quot;, df_pelanggan_etl.count(), &quot;baris&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/929/1*t0TRWEvm0X6kViCnGikSwQ.png" /></figure><h4>Transform</h4><p>Pada proses ini, data yang sebelumnya telah dibaca selanjutnya akan diolah. Sebagai contoh, data pada contoh sebelumnya akan digabung dengan .join() setelah itu data akan diturunkan ke kolom turunan lewat .withColumn() lalu data tersebut di cek kembali menggunakan .filter()</p><pre>from pyspark.sql.functions import when<br><br>df_etl = df_transaksi_etl.join(df_pelanggan_etl, on=&quot;customer_id&quot;, how=&quot;left&quot;)<br><br>df_etl = df_etl.withColumn(<br>    &quot;segmen_transaksi&quot;,<br>    when(col(&quot;pendapatan&quot;) &gt;= 300000, &quot;Tinggi&quot;)<br>    .when(col(&quot;pendapatan&quot;) &gt;= 150000, &quot;Sedang&quot;)<br>    .otherwise(&quot;Rendah&quot;)<br>)<br><br>jumlah_tanpa_pelanggan = df_etl.filter(col(&quot;nama&quot;).isNull()).count()<br>print(f&quot;Transaksi tanpa data pelanggan yang cocok: {jumlah_tanpa_pelanggan}&quot;)<br><br>df_etl.select(&quot;order_id&quot;, &quot;nama&quot;, &quot;membership&quot;, &quot;kategori&quot;, &quot;pendapatan&quot;, &quot;segmen_transaksi&quot;).show(5)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1002/1*6IdWSEjvTs7lwNPEuUwdgA.png" /></figure><h4>Load</h4><p>Proses ini berfungsi untuk menyimpan hasilnya menuju tujuan ahir. Pada code sebelumnya, data tersebut akan disimpan dalam format parquet di HDFS. Sebagai contoh kira-kira seperti ini</p><pre>!hdfs dfs -mkdir -p /home/plont/Documents/Praktikum_Big_Data/modul/etl_output/transaksi_enriched<br><br>df_etl.write.mode(&quot;overwrite&quot;).partitionBy(&quot;kategori&quot;).parquet(<br>    &quot;hdfs://localhost:9000/home/plont/Documents/Praktikum_Big_Data/modul/etl_output/transaksi_enriched&quot;<br>)<br><br>print(&quot;Pipeline ETL selesai — hasil tersimpan di HDFS.&quot;)<br>!hdfs dfs -ls /home/plont/Documents/Praktikum_Big_Data/modul/etl_output/transaksi_enriched</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2DBwVg7IywEecajvaeMU-A.png" /></figure><p>Setelah selesai pada proses Load, langkah selanjutnya adalah melakukan uji coba yaitu melakukan verifikasi hasil ahir dengan membaca kembali data lewat HDFS. Sebagai contoh kira-kira seperti ini</p><pre>df_final = spark.read.parquet(&quot;hdfs://localhost:9000/home/plont/Documents/Praktikum_Big_Data/modul/etl_output/transaksi_enriched&quot;)<br>print(&quot;Jumlah baris hasil akhir:&quot;, df_final.count())<br><br><br>df_final.groupBy(&quot;segmen_transaksi&quot;).agg(<br>    count(&quot;order_id&quot;).alias(&quot;jumlah_transaksi&quot;),<br>    avg(&quot;pendapatan&quot;).alias(&quot;rata_rata_pendapatan&quot;)<br>).orderBy(&quot;segmen_transaksi&quot;).show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PU565HWMDbpE4Ss1f8S0sg.png" /></figure><p>Setelah mempelajari hal tersebut, hal yang dapat dilakukan selanjutnya adalah mencoba mengerjakan beberapa soal. Namun sebelum mengerjakan soal, terdapat code yang harus dijalankan. Untuk menjalankannya kira-kira seperti ini</p><pre>spark = SparkSession.builder.appName(&quot;Latihan6&quot;).master(&quot;local[*]&quot;).getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>df_transaksi_etl = spark.read.csv(&quot;data_transaksi_besar.csv&quot;, header=True, inferSchema=True)<br>df_pelanggan_etl = spark.read.json(&quot;data_pelanggan.json&quot;)<br>print(&quot;Siap untuk latihan.&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/936/1*-kD-wshC-Gmb6C7Xu8iRwg.png" /></figure><h4>Soal pertama</h4><p>Setelah menjalankan kode tersebut, soal pertama sudah dapat dikerjakan. Soal pertama meminta penjawab untuk membaca kembali data_transaksi_besar_parquet (hasil Sub-bab 6.1.1) menggunakan spark.read.parquet(), lalu tampilkan printSchema()-nya. Setelah menampilkannya, penjawab dapat membandingkan dengan skema hasil inferSchema=True pada CSV untuk menjawab apakah tipe datanya sama. Untuk menjawabnya kira-kira seperti ini</p><pre>df_parquet = spark.read.parquet(&quot;data_transaksi_besar_parquet&quot;)<br><br>print(&quot;=== Skema dari Parquet ===&quot;)<br>df_parquet.printSchema()<br><br>print(&quot;=== Skema dari CSV (inferSchema=True) ===&quot;)<br>df_transaksi_etl.printSchema()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*IsOrcpT-Sx4v_3nVBn0d6A.png" /></figure><p>Keduanya ternyata memiliki metadata yang sama. Umumnya, perbedaan antar keduanya bukan pada tipe datanya, melainkan cara kerjanya.</p><h4>Soal kedua</h4><p>Setelah menjawab soal pertama, langkah selanjutnya adalah menjawab soal kedua. Soal kedua berbunyi “Gabungkan df_transaksi_etl dengan df_pelanggan_etl, lalu tampilkan jumlah transaksi untuk masing-masing nilai membership (Silver/Gold/Platinum).” Untuk menjawabnya kira-kira seperti ini</p><pre>df_gabung = df_transaksi_etl.join(df_pelanggan_etl, on=&quot;customer_id&quot;, how=&quot;inner&quot;)<br><br>df_gabung.groupBy(&quot;membership&quot;) \<br>    .count() \<br>    .withColumnRenamed(&quot;count&quot;, &quot;jumlah_transaksi&quot;) \<br>    .orderBy(&quot;membership&quot;) \<br>    .show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/835/1*pSTAymKe8dzT84rNwq9jfg.png" /></figure><h4>Soal ketiga</h4><p>Setelah menjawab soal kedua, langkah selanjutnya adalah menjawab soal ketiga. Soal ketiga berbunyi “Tulis ulang hasil gabungan Soal 2 (sebelum di-groupBy) ke disk lokal dalam format Parquet, dipartisi berdasarkan membership. Tampilkan struktur foldernya dengan !ls.” Untuk menjawabnya, kira-kira seperti ini</p><pre>df_gabung = df_transaksi_etl.join(df_pelanggan_etl, on=&quot;customer_id&quot;, how=&quot;inner&quot;)<br><br>df_gabung.write \<br>    .mode(&quot;overwrite&quot;) \<br>    .partitionBy(&quot;membership&quot;) \<br>    .parquet(&quot;data_gabungan_parquet&quot;)<br><br>!ls data_gabungan_parquet</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/868/1*TDI-5rmmKV6wE-ctavOBKA.png" /></figure><p>Untuk memperdalam kemampuan, terdapat soal yang dapat dikerjakan lagi, namun sebelum mengerjakannya, jalankan kode ini terlebih dahulu</p><pre>import numpy as np<br>import pandas as pd<br>import json<br><br>np.random.seed(33)<br><br># Sumber 1: Transaksi (CSV) — 5000 baris<br>n_trx = 5000<br>kategori_list = [&quot;Elektronik&quot;, &quot;Fashion&quot;, &quot;Makanan&quot;, &quot;Rumah Tangga&quot;, &quot;Kesehatan&quot;]<br>df_trx_tugas6 = pd.DataFrame({<br>    &quot;order_id&quot;: [f&quot;TX{i}&quot; for i in range(n_trx)],<br>    &quot;product_id&quot;: np.random.randint(1, 31, size=n_trx),<br>    &quot;unit_terjual&quot;: np.random.randint(1, 8, size=n_trx),<br>    &quot;tanggal&quot;: np.random.choice(pd.date_range(&quot;2026-10-01&quot;,&quot;2026-10-31&quot;), size=n_trx).astype(str),<br>})<br>df_trx_tugas6.to_csv(&quot;tugas6_transaksi.csv&quot;, index=False)<br><br># Sumber 2: Data produk (JSON Lines) — 30 produk<br>produk = [<br>    {&quot;product_id&quot;: i, &quot;nama_produk&quot;: f&quot;Produk-{i}&quot;, &quot;kategori&quot;: np.random.choice(kategori_list),<br>     &quot;harga&quot;: int(np.random.choice([25000,50000,75000,100000,150000,250000]))}<br>    for i in range(1, 31)<br>]<br>with open(&quot;tugas6_produk.json&quot;, &quot;w&quot;) as f:<br>    for p in produk:<br>        f.write(json.dumps(p) + &quot;\n&quot;)<br><br># Sumber 3: Data ulasan (CSV) — tidak semua transaksi memiliki ulasan (realistis)<br>n_review = 3500<br>df_review = pd.DataFrame({<br>    &quot;order_id&quot;: np.random.choice(df_trx_tugas6[&quot;order_id&quot;], size=n_review, replace=False),<br>    &quot;rating&quot;: np.random.randint(1, 6, size=n_review),<br>})<br>df_review.to_csv(&quot;tugas6_ulasan.csv&quot;, index=False)<br><br>print(f&quot;Tiga sumber data berhasil dibuat:&quot;)<br>print(f&quot;- tugas6_transaksi.csv : {len(df_trx_tugas6)} baris&quot;)<br>print(f&quot;- tugas6_produk.json   : {len(produk)} baris&quot;)<br>print(f&quot;- tugas6_ulasan.csv    : {len(df_review)} baris (tidak seluruh transaksi memiliki ulasan)&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/995/1*OeG_hb-EvbiE--aVt7-qag.png" /></figure><h4>Soal pertama</h4><p>Soal pertama berbunyi “Baca ketiga sumber data (tugas6_transaksi.csv, tugas6_produk.json, tugas6_ulasan.csv) menjadi tiga Spark DataFrame terpisah. Tampilkan jumlah baris dan printSchema() masing-masing.” Untuk menjawabnya kira-kira seperti ini</p><pre>from pyspark.sql import SparkSession<br><br>spark = SparkSession.builder \<br>    .appName(&quot;Tugas_6&quot;) \<br>    .master(&quot;local[*]&quot;) \<br>    .getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>df_t = spark.read.csv(&quot;tugas6_transaksi.csv&quot;, header=True, inferSchema=True)<br>df_p = spark.read.json(&quot;tugas6_produk.json&quot;)<br>df_u = spark.read.csv(&quot;tugas6_ulasan.csv&quot;, header=True, inferSchema=True)<br><br>print(&quot;tugas6_transaksi.csv&quot;)<br>df_t.printSchema()<br><br>print(&quot;tugas6_produk.json&quot;)<br>df_p.printSchema()<br><br>print(&quot;tugas6_ulasan.csv&quot;)<br>df_u.printSchema()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/730/1*8r9qeDBXkDrUY4SuRhTwQQ.png" /></figure><h4>Soal kedua</h4><p>Untuk bunyi soal kedua seperti ini “Gabungkan ketiga DataFrame menjadi satu (order_id sebagai kunci ke ulasan, product_id sebagai kunci ke produk). Gunakan salah satu join yang tepat dari transaksi ke ulasan (karena tidak semua transaksi memiliki ulasan) dan salah satu join yang tepat dari transaksi ke produk (karena setiap transaksi pasti memiliki produk yang valid). Tambahkan kolom total_pendapatan (unit_terjual x harga).”</p><pre>from pyspark.sql.functions import col, sum as spark_sum, avg, count<br><br>gabung1 = df_t.join(df_p, on=&quot;product_id&quot;, how=&quot;left&quot;)<br>gabung2 = gabung1.join(df_u, on=&quot;order_id&quot;, how=&quot;left&quot;)<br><br>answer2 = gabung2.withColumn(&quot;total_pendapatan&quot;, col(&quot;unit_terjual&quot;) * col(&quot;harga&quot;))<br>answer2.show()e</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/909/1*iW5aSrJshmzGjFkxZc7Uog.png" /></figure><h4>Soal ketiga</h4><p>Untuk soal ketiga berbunyi seperti ini “Transaksi tanpa ulasan akan memiliki rating bernilai kosong (null) setelah salah satu join yang tepat — isi nilai kosong tersebut dengan angka <strong>0</strong> menggunakan salah satu function, sertakan alasan singkat mengapa 0 (bukan nilai lain) masuk akal untuk kasus &quot;belum ada ulasan&quot;. Tambahkan kolom ada_ulasan bernilai True/False (tidak boleh diisi manual satu satu), **sebelum** langkah na.fill()` di atas).” Untuk menjawabnya kira-kira seperti ini</p><pre>kolom_baru = answer2.withColumn(&quot;ada_ulasan&quot;, col(&quot;rating&quot;).isNotNull())<br><br>answer3 = kolom_baru.na.fill(0, subset=[&quot;rating&quot;])<br>answer3.show()<br><br># alasan kenapa 0 masuk akal untuk kasus &quot;belum ada ulasan&quot;: karena dalam sistem rating yang melibatkan angka 1 sampai 5, angka 0 berada<br># diluar jangkauan sehingga angka 0 dinilai cocok sebagai indikator bahwa rating belum diberikan. Ini juga sebagai indikator kalau rating<br># masih berstatus false</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L47EgmSx_Xn3qUv3UEo7gw.png" /></figure><h4>Soal keempat</h4><p>Soal keempat berbunyi “Simpan hasil akhir ke HDFS dalam format Parquet, dipartisi berdasarkan kategori, ke path /home/plont/Documents/Praktikum_Big_Data/tugas/tugas_6/hasil_etl. Verifikasi dengan hdfs dfs -ls -R, lalu baca kembali dan tampilkan count()-nya sebagai bukti data tersimpan utuh.”</p><pre>!hdfs dfs -mkdir -p /home/plont/Documents/Praktikum_Big_Data/tugas/tugas_6/hasil_etl<br>path = &quot;/home/plont/Documents/Praktikum_Big_Data/tugas/tugas_6/hasil_etl&quot;<br><br>answer3.write \<br>    .mode(&quot;overwrite&quot;) \<br>    .partitionBy(&quot;kategori&quot;) \<br>    .parquet(path)<br><br>!hdfs dfs -ls -R /home/plont/Documents/Praktikum_Big_Data/tugas/tugas_6/hasil_etl<br><br>print(&quot;-&quot; * 50)<br><br>df_hasil_etl = spark.read.parquet(path)<br><br>jumlah_awal = answer3.count()<br>jumlah_akhir = df_hasil_etl.count()<br><br>print(f&quot;Jumlah baris sebelum disimpan : {jumlah_awal}&quot;)<br>print(f&quot;Jumlah baris setelah dibaca   : {jumlah_akhir}&quot;)<br><br>if jumlah_awal == jumlah_akhir:<br>    print(&quot;Data tersimpan utuh&quot;)<br>else:<br>    print(&quot;data tidak sesuai&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/681/1*wQGQdsvX1lA2jzF2h0dyAg.png" /></figure><h4>Soal kelima</h4><p>Bunyi soal kelima seperti ini “Dari data hasil ETL, tampilkan (menggunakan DataFrame API atau Spark SQL, bebas memilih): kategori produk mana yang memiliki persentase transaksi dengan ulasan (ada_ulasan = True) paling rendah? Tulis 2–3 kalimat interpretasi bisnis pada markdown cell: mengapa hal ini mungkin penting diketahui oleh tim marketing?”</p><pre>from pyspark.sql.functions import col, sum as spark_sum, count, round<br><br>df_persentase = df_hasil_etl.groupBy(&quot;kategori&quot;) \<br>    .agg(<br>        count(&quot;*&quot;).alias(&quot;total_transaksi&quot;),<br>        spark_sum(col(&quot;ada_ulasan&quot;).cast(&quot;int&quot;)).alias(&quot;transaksi_ada_ulasan&quot;) <br>    ) \<br>    .withColumn(&quot;persentase_ulasan&quot;, round((col(&quot;transaksi_ada_ulasan&quot;) / col(&quot;total_transaksi&quot;)) * 100, 2)) \<br>    .orderBy(&quot;persentase_ulasan&quot;)<br><br>df_persentase.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/891/1*Wrwxu3YijlJ9ljozfOg6dg.png" /></figure><p>lalu kenapa ini penting untuk diketahui tim marketing? Hal ini dinilai penting bagi tim marketing karena ulasan dinilai sangat berguna bagi developer agar bisa mengembangkan produknya menjadi lebih baik. Tanpa ulasan, produk tersebut lebih sulit untuk diketahui bagian kekurangannya. Minimnya rating juga terkadang membuat pembeli lain menjadi ragu akan produk tersebut sehingga developer bisa kehilangan calon pembeli</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c76665aab800" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Just use it (Java edition)]]></title>
            <link>https://medium.com/@Akmal_Zidan/just-use-it-java-edition-79ab2556ab56?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/79ab2556ab56</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[polymorphism]]></category>
            <category><![CDATA[jawa]]></category>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Mon, 28 Sep 2026 05:09:21 GMT</pubDate>
            <atom:updated>2026-09-28T05:09:21.298Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0o8kffcTM1yoilEv" /><figcaption>Photo by <a href="https://unsplash.com/@markusspiske?utm_source=medium&amp;utm_medium=referral">Markus Spiske</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>What?</h3><p><strong>Polimorfisme</strong>, istilah ini sebenarnya berasal dari bahasa yunani yang artinya “banyak bentuk”. Istilah ini diadopsi ke dalam pemrograman berorientasi objek sebagai nama dari fungsi yang memungkinkan 1 superclass dapat digunakan oleh berbagai subclass berbeda.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8x8MUSyhFZDZrG3wMkpg0A.png" /><figcaption>photo by Imam Adi Nata, M.kom from lecturer Tidar University</figcaption></figure><p>Umumya, terdapat 2 jenis Polimorfisme yang ada pada bahasa pemrograman Java yaitu</p><ul><li><strong>Compile-time/Static Polymorphism</strong><br>Jenis Polimorfisme ini dapat terjadi ketika kompilasi program dan dapat dicapai dengan method overloading atau operator overloading</li><li><strong>Runtime/Dynamic Polymorphism</strong><br>Jenis polimerfisme ini dapat terjadi ketika program berjalan pada proses ketika Java memutuskan untuk memilih metode yang akan dipanggil menurut objek nyata yang dibuat saat runtime. Polimerfisme jenis ini biasanya dicapai melalui method overriding</li></ul><h4>Ways to implement</h4><p>Dalam bahasa pemrograman Java, konsep polimerfisme diimplementasikan dalam 2 cara atau 2 mekanisme yaitu</p><ul><li><strong>Overloading<br></strong>Mekanisme overloading terjadi ketika pengguna membuat beberapa method dengan nama yang sama dalam 1 class, namun dibedakan dengan parameter yang berbeda entah itu jumlahnya, tipenya atau urutannya. Java sendiri akan menentukan method mana yang dapat dijalankan tergantung pada apa yang akan dimasukkan user.</li><li><strong>Overriding</strong><br>Mekanisme overriding terjadi ketika sebuah subclass menimpa atau memodifikasi method yang sudah dideklarasi oleh superclass. Berbeda dengan mekanisme overloading, overriding mengharuskan kedua method harus sama tanpa adanya perbedaan. Mekanisme ini sendiri dijalankan ketika runtime, lebih tepatnya saat Java sedang menentukan method yang akan dieksekusi, method yang dieksekusi tetaplah bergantung pada objek.</li></ul><p>Jika ditanya tentang kelebihan dari Polimerfisme itu sendiri, terdapat beberapa kelebihan yaitu</p><ul><li>Polimorfisme memiliki kelebihan dalam fleksibility, ini membuat kode mudah beradaptasi ketika terjadi perubahan</li><li>Polimorfisme juga memiliki kelebihan dalam reusability. Kelebihan ini memungkinkan sebuah kode dapat digunakan kembali menjadi berbagai jenis objek, menyebabkan tidak perlunya user dalam membuat kembali class yang sama</li><li>Kelebihan Polimorfisme yang lain adalah mempermudah user dalam memelihara kode</li><li>Kelebihan lain yang ada pada Polimorfisme adalah Extensibility yaitu kemudahan peluasan sistem dengan menambah sub class baru, mirip seperti kelebihan Polimorfisme yang lain yaitu reusability</li></ul><h3>Try</h3><p>Setelah mempelajari sedikit tentang konsep Polimerfisme, hal yang dapat dipelajari setelahnya adalah cara mengimplementasikannya. Untuk mengimplementasikannya kira-kira seperti ini</p><h4>How to try Overloading</h4><p>Hal pertama yang dapat dibuat adalah membuat superclass yang berisi berbagai method, tujuannya adalah membuat method yang akan di overloading oleh subclass. Sebagai contoh kira-kira seperti ini :</p><pre>class animal {<br>    public void Sound() {<br>        System.out.println(&quot;Sound of animal&quot;);<br>    }<br>    <br>    public void Eat(String food) {<br>        System.out.println(&quot;What does that animal eat : &quot; + food);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/613/1*_mYY5fuS_n244oNmkyrq4A.png" /></figure><p>Setelah membuat Superclass dan methodnya, langkah selanjutnya adalah membuat 2 methode dengan parameter yang berbeda. Hal ini bertujuan sebagai implementasi langsung terhadap pengertian dari mekanisme Overloading. Sebagai contoh kira-kira seperti ini :</p><pre>class animal {<br>    public void Sound() {<br>        System.out.println(&quot;Sound of animal&quot;);<br>    }<br>    <br>    public void Eat(String food) {<br>        System.out.println(&quot;What does that animal eat : &quot; + food);<br>    }<br>    <br>    public void Eat(int amount, String food) {<br>        System.out.println(&quot;How much food : &quot; + amount + &quot; for &quot; + food);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/677/1*USdxn0JW1c4o_h638KGHkw.png" /></figure><p>Setelah selesai membuat 2 methode dengan parameter yang berbeda, langkah selanjutnya adalah membuat objek baru dari class tadi. Sebagai contoh kira-kira seperti ini:</p><pre>class animal {<br>    public void Sound() {<br>        System.out.println(&quot;Sound of animal&quot;);<br>    }<br>    <br>    public void Eat(String food) {<br>        System.out.println(&quot;What does that animal eat : &quot; + food);<br>    }<br>    <br>    public void Eat(int amount, String food) {<br>        System.out.println(&quot;How much food : &quot; + amount + &quot; for &quot; + food);<br>    }<br>}<br><br>public class PraktikumPBO_6 {<br>    public static void main(String[] args) {<br>        animal Cat = new animal();<br>        Cat.Sound();<br>        Cat.Eat(&quot;wiskas&quot;);<br>        Cat.Eat(1000, &quot;wiskas&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/663/1*HUgkCYPnuPTgAET1hVWvoQ.png" /></figure><h4>How to try Overrinding</h4><p>Setelah mencoba metode overloading, mekanisme selanjutnya yang dapat dicoba adalah mekanisme overriding. Untuk mencoba overriding, hal pertama yang harus dilakukan adalah membuat 2 kelas turunan dari kelas yang sudah dibuat sebelumnya atau dapat membuat yang baru jika langkah sebelumnya belum terlaksana, jenis polimorfisme yang digunakan adalah jenis runtime. Sebagai contoh, kira-kira seperti ini</p><pre>class Cat extends animal {<br>    @Override<br>    public void Sound() {<br>        System.out.println(&quot;miaw&quot;);<br>    }<br>}<br><br>class Dog extends animal {<br>    @Override<br>    public void Sound() {<br>        System.out.println(&quot;guk&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/357/1*SxQtNxJ6nLumpJkl8FicFQ.png" /></figure><p>Setelah menambahkan metode tersebut, langkah selanjutnya adalah menjalankannya. Sebagai contoh kira-kira seperti ini:</p><pre>class animal {<br>    public void Sound() {<br>        System.out.println(&quot;Sound of animal&quot;);<br>    }<br>    <br>    public void Eat(String food) {<br>        System.out.println(&quot;What does that animal eat : &quot; + food);<br>    }<br>    <br>    public void Eat(int amount, String food) {<br>        System.out.println(&quot;How much food : &quot; + amount + &quot; for &quot; + food);<br>    }<br>}<br><br>class Cat extends animal {<br>    @Override<br>    public void Sound() {<br>        System.out.println(&quot;miaw&quot;);<br>    }<br>}<br><br>class Dog extends animal {<br>    @Override<br>    public void Sound() {<br>        System.out.println(&quot;guk&quot;);<br>    }<br>}<br><br>public class PraktikumPBO_6 {<br>    public static void main(String[] args) {<br>        animal empus = new Cat();<br>        empus.Sound();<br>        empus.Eat(&quot;wiskas&quot;);<br>        empus.Eat(1000, &quot;wiskas&quot;);<br>        <br>        animal dawg = new Dog();<br>        dawg.Sound();<br>        dawg.Eat(&quot;royal canin for dawg&quot;);<br>        dawg.Eat(1, &quot;royal canin for dawg&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/1*Z17InANAFXCmoRmzBsUXSQ.png" /></figure><h3>Trying to solve a minor case</h3><p>Setelah mempelajari apa itu Polimorfisme, terdapat beberapa hal yang dapat dicoba kembali. Sebagai contoh terdapat beberapa soal yang dapat dicoba. Untuk soalnya kira-kira seperti ini</p><h4>First</h4><p>Soal pertama meminta penjawab untuk membuat kelas abstrak Produk dengan atribut nama dan harga lalu tambahkan method. Untuk membuatnya kira-kira seperti ini</p><pre>class Produk {<br>    String nama;<br>    int harga;<br>    int diskon;<br>    <br>    public void name_produk() {<br>        System.out.println(&quot;Nama barang : &quot; + nama);<br>    }<br>    <br>    public void price() {<br>        System.out.println(&quot;Harga barang tergantung barang&quot;);<br>    }<br>    <br>    public void hitungDiskon() {<br>        System.out.println(&quot;Kamu dapat diskon&quot;);<br>    }<br>    <br>    public void total() {<br>        System.out.println(&quot;Ini total harga&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/630/1*pNy3wSzjAC0_p0MyX2OYkw.png" /></figure><h4>Second</h4><p>Setelah menyelesaikan soal pertama, soal kedua sudah dapat dikerjakan. Soal kedua meminta penjawab untuk membuat kelas turunan Buku, Elektronik, dan Pakaian yang mewarisi kelas Produk. Untuk menjawabnya kira-kira seperti ini</p><pre>class produk {<br>    String nama;<br>    int harga;<br>    <br>    public void name_produk() {<br>        System.out.println(&quot;nama barang : &quot; + nama);<br>    }<br>    <br>    public void price() {<br>        System.out.println(&quot;harga barang : &quot; + harga);<br>    }<br>    <br>    public void hitungDiskon() {<br>        System.out.println(&quot;kamu dapat diskon&quot;);<br>    }<br>}<br><br>class buku extends produk {<br>    <br>}<br><br>class elektronik extends produk {<br>    <br>}<br><br>class pakaian extends produk {<br>    <br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/526/1*K_56uib6b3bsh5HjCkRNQg.png" /></figure><h4>Third</h4><p>Setelah menyelesaikan soal kedua, soal ketiga sudah dapat dikerjakan. Soal ketiga meminta penjawab untuk melakukan mekanisme Override metode hitungDiskon() pada setiap kelas turunan untuk menghitung diskon yang berbeda-beda. Untuk menjawabnya kira-kira seperti ini</p><pre>class Produk {<br>    String nama;<br>    int harga;<br>    int diskon;<br>    <br>    public void name_produk() {<br>        System.out.println(&quot;Nama barang : &quot; + nama);<br>    }<br>    <br>    public void price() {<br>        System.out.println(&quot;Harga barang tergantung barang&quot;);<br>    }<br>    <br>    public void hitungDiskon() {<br>        System.out.println(&quot;Kamu dapat diskon&quot;);<br>    }<br>    <br>    public void total() {<br>        System.out.println(&quot;Ini total harga&quot;);<br>    }<br>}<br><br>class Buku extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }<br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class Elektronik extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }<br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class Pakaian extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }    <br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/735/1*UHTk7MShDD_PiBllIrdRng.png" /></figure><h4>Four</h4><p>Setelah menyelesaikan soal ketiga, soal keempat sudah dapat dikerjakan. Soal keempat meminta penjawab untuk membuatlah sebuah kelas KeranjangBelanja yang menyimpan list of Produk dan memiliki metode untuk menghitung total harga setelah diskon</p><pre>class Produk {<br>    String nama;<br>    int harga;<br>    int diskon;<br>    <br>    public void name_produk() {<br>        System.out.println(&quot;Nama barang : &quot; + nama);<br>    }<br>    <br>    public void price() {<br>        System.out.println(&quot;Harga barang tergantung barang&quot;);<br>    }<br>    <br>    public void hitungDiskon() {<br>        System.out.println(&quot;Kamu dapat diskon&quot;);<br>    }<br>    <br>    public void total() {<br>        System.out.println(&quot;Ini total harga&quot;);<br>    }<br>}<br><br>class Buku extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }<br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class Elektronik extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }<br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class Pakaian extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }    <br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class KeranjangBelanja extends Produk {<br>    @Override<br>    public void total() {<br>        int nominalDiskon = (harga * diskon) / 100;<br>        int totalAkhir = harga - nominalDiskon;<br>        System.out.println(&quot;Total harga setelah diskon: Rp &quot; + totalAkhir);<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/773/1*Ae0NErmMMHRXTKwlDb21Bw.png" /></figure><h4>Test it</h4><p>Setelah menyelesaikan kodenya, langkah selanjutnya adalah mencobanya. Untuk mencobanya kira-kira seperti ini</p><pre>class Produk {<br>    String nama;<br>    int harga;<br>    int diskon;<br>    <br>    public void name_produk() {<br>        System.out.println(&quot;Nama barang : &quot; + nama);<br>    }<br>    <br>    public void price() {<br>        System.out.println(&quot;Harga barang tergantung barang&quot;);<br>    }<br>    <br>    public void hitungDiskon() {<br>        System.out.println(&quot;Kamu dapat diskon&quot;);<br>    }<br>    <br>    public void total() {<br>        System.out.println(&quot;Ini total harga&quot;);<br>    }<br>}<br><br>class Buku extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }<br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class Elektronik extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }<br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class Pakaian extends Produk {<br>    @Override<br>    public void price() {<br>        System.out.println(&quot;Harga barang : &quot; + harga);<br>    }    <br>    <br>    @Override<br>    public void hitungDiskon() {<br>        System.out.println(&quot;Diskon yang didapat : &quot; + diskon + &quot;%&quot;);<br>    }<br>}<br><br>class KeranjangBelanja extends Produk {<br>    @Override<br>    public void total() {<br>        int nominalDiskon = (harga * diskon) / 100;<br>        int totalAkhir = harga - nominalDiskon;<br>        System.out.println(&quot;Total harga setelah diskon: Rp &quot; + totalAkhir);<br>    }<br>}<br><br>public class PraktikumPBO_6 {<br>    public static void main(String[] args) {<br>        Produk book = new Buku();<br>        book.nama = &quot;Kitab Ngawi&quot;;<br>        book.harga = 1000000;<br>        book.diskon = 30;<br>        <br>        book.name_produk();<br>        book.price();<br>        book.hitungDiskon();<br>        <br>        KeranjangBelanja b = new KeranjangBelanja();<br>        b.harga = book.harga;<br>        b.diskon = book.diskon;<br>        b.total(); <br>        <br>        Produk electronic = new Elektronik();<br>        electronic.nama = &quot;Flipper zero&quot;;<br>        electronic.harga = 3036930;<br>        electronic.diskon = 5;<br>        <br>        electronic.name_produk();<br>        electronic.price();<br>        electronic.hitungDiskon();<br>        <br>        KeranjangBelanja e = new KeranjangBelanja();<br>        e.harga = electronic.harga;<br>        e.diskon = electronic.diskon;<br>        e.total(); <br>        <br>        Produk shirt = new Pakaian();<br>        shirt.nama = &quot;baju spartan&quot;;<br>        shirt.harga = 950000;<br>        shirt.diskon = 10;<br>        <br>        shirt.name_produk();<br>        shirt.price();<br>        shirt.hitungDiskon();<br>        <br>        KeranjangBelanja p = new KeranjangBelanja();<br>        p.harga = shirt.harga;<br>        p.diskon = shirt.diskon;<br>        p.total(); <br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/658/1*tGAvvWehr0H--5T83dAtww.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=79ab2556ab56" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[More about PySpark DataFrame]]></title>
            <link>https://medium.com/@Akmal_Zidan/more-about-pyspark-dataframe-9e650e72bf4c?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/9e650e72bf4c</guid>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Thu, 24 Sep 2026 03:39:34 GMT</pubDate>
            <atom:updated>2026-09-30T16:55:59.098Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*t43kFaioovk-E7M_" /><figcaption>Photo by <a href="https://unsplash.com/@danesduet?utm_source=medium&amp;utm_medium=referral">Daniel Olah</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>PySpark masih menyimpan berbagai hal yang bisa digali lebih dalam. Kira-kira seperti ini:</p><h3>Try it</h3><p>Ada beberapa tahapan yang dapat dicoba untuk mempelajari PySpark DataFrame tingkat lanjut yaitu seperti menggabungkan DataFrame, Menjalankan Kueri SQL di Atas DataFrame dan mencoba Window Function. Untuk langkah-langkahnya kira-kira seperti ini</p><h4>Create a SparkSession &amp; Dataset</h4><p>Hal yang dapat dilakukan pertama kali adalah membuat SparkSession dan dataset. Sebagai contoh kira-kira seperti ini</p><pre>gunakan code ini untuk menjalankan SparkSessionfrom pyspark.sql import SparkSession<br>from pyspark.sql.functions import col, sum as spark_sum, avg, count, rank, row_number, when<br>from pyspark.sql.window import Window<br><br>spark = SparkSession.builder \<br>    .appName(&quot;Pertemuan5-JoinWindowSQL&quot;) \<br>    .master(&quot;local[*]&quot;) \<br>    .getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>print(&quot;SparkSession siap. Versi Spark:&quot;, spark.version)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vVwXwbKp-OGjalqbSmHNYg.png" /></figure><p>setelah membuat SparkSession, langkah selanjutnya adalah membuat 2 tabel sebagai yang digunakan untuk mensimulasikan skenario yang ada pada dunia nyata dimana data tersebar di beberapa sumber dan perlu digabung. Sebagai contoh, kira-kira seperti ini</p><pre>import numpy as np<br>import pandas as pd<br><br>np.random.seed(7)<br>kategori_list = [&quot;Elektronik&quot;, &quot;Fashion&quot;, &quot;Makanan &amp; Minuman&quot;, &quot;Kesehatan &amp; Kecantikan&quot;, &quot;Rumah Tangga&quot;]<br><br># Tabel referensi/master: target &amp; manager per kategori (data ini relatif statis, jarang berubah)<br>data_produk = {<br>    &quot;kategori&quot;: kategori_list,<br>    &quot;target_bulanan&quot;: [50000000, 40000000, 30000000, 25000000, 20000000],<br>    &quot;manager&quot;: [&quot;Andi&quot;, &quot;Budi&quot;, &quot;Citra&quot;, &quot;Dewi&quot;, &quot;Eka&quot;],<br>}<br>df_produk = spark.createDataFrame(pd.DataFrame(data_produk))<br><br># Tabel transaksi: data yang terus bertambah setiap hari<br>n = 300<br>data_transaksi = {<br>    &quot;order_id&quot;: [f&quot;O{i}&quot; for i in range(n)],<br>    &quot;kategori&quot;: np.random.choice(kategori_list, size=n),<br>    &quot;kota&quot;: np.random.choice([&quot;Magelang&quot;, &quot;Semarang&quot;, &quot;Solo&quot;], size=n),<br>    &quot;pendapatan&quot;: np.random.randint(50000, 500000, size=n),<br>}<br>df_transaksi = spark.createDataFrame(pd.DataFrame(data_transaksi))<br><br>print(&quot;df_produk:&quot;)<br>df_produk.show()<br>print(&quot;df_transaksi (5 baris pertama dari total&quot;, df_transaksi.count(), &quot;baris):&quot;)<br>df_transaksi.show(5)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/746/1*T8haqdjlFy3qk7biNbbtYg.png" /></figure><h4>Combine the dataset</h4><p>Setelah membuat SparkSession dan DataSet, hal yang dapat dicoba pertama kali adalah menggabungkan dataset. Umumnya, terdapat 4 jenis operasi join yaitu</p><ul><li><strong>Default</strong><br>Operasi join tipe default (atau inner join) biasanya menghasilkan baris yang memiliki kecocokan antar kedua tabel. Artinya jika terdapat data yang sama pada kedua tabel maka operasi join tipe default ini akan mengambilnya dan membuang sisanya</li><li><strong>Left Join</strong><br>Operasi join tipe ini biasanya hanya mempertahankan seluruh data dari DataFrame yang ada di sisi kiri atau DataFrame yang pertama kali dipanggil</li><li><strong>Right Join</strong><br>Operasi join tipe ini merupakan kebalikan dari Left Join. Operasi tipe ini biasanya hanya mempertahankan seluruh data dari DataFrame yang ada di sisi kanan atau DataFrame kedua yang dipanggil</li><li><strong>Outer Join</strong><br>Operasi join tipe ini merupakan gabungan dari Left Join dan Inner Join. Operasi join tipe ini akan mempertahankan semua baris data dari kedua tabel tanpa syarat</li></ul><p>Sebagai contoh gunakan code ini untuk mencoba Left Join</p><pre>df_gabung = df_transaksi.join(df_produk, on=&quot;kategori&quot;, how=&quot;left&quot;)<br>df_gabung.show(5)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/568/1*u9dSkip0QMtvk7ssDVDAxA.png" /></figure><p>Untuk contoh lain jika mengacu pada kejadian yang umum terjadi, tabel transaksi biasanya memiliki jutaan bahkan miliaran baris. Dalam skenario yang tidak umum, jika operasi join digunakan secara langsung misalnya antara tabel transaksi mentah yang memiliki data masif dengan tabel referensi atau tabel target, ini membuat spark harus melakukan data shuffling atau perpindahan data antar node dalam cluster yang dinilai sangat berat sehingga dapat memakan waktu yang lama dan beresiko menyebabkan out of memory. Dalam skenario umum, data harus diringkas terlebih dahulu sebelum digabungkan dengan tabel referensi. Untuk mencobanya, gunakan code ini dalam jupyter atau text editor lainnya :</p><pre>ringkasan = df_transaksi.groupBy(&quot;kategori&quot;).agg(<br>    spark_sum(&quot;pendapatan&quot;).alias(&quot;total_pendapatan&quot;)<br>)<br><br>hasil = ringkasan.join(df_produk, on=&quot;kategori&quot;, how=&quot;inner&quot;)<br>hasil = hasil.withColumn(<br>    &quot;pencapaian_persen&quot;,<br>    (col(&quot;total_pendapatan&quot;) / col(&quot;target_bulanan&quot;) * 100)<br>)<br><br>hasil.orderBy(col(&quot;pencapaian_persen&quot;).desc()).show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/607/1*l7SB8g_MCZMJ-k5_3ycGEw.png" /></figure><h4>Group by without depreciation</h4><p>Umumnya, GROUP BY akan menyebabkan penyusutan karena mekanismenya yang mengelompokkan baris data yang memiliki nilai yang sama dan fungsi agresiasinya seperti OUNT(), SUM(), AVG(), MAX(), atau MIN(). Namun ada fitur yang memiliki kemampuan seperti GROUP BY namun tidak mengalami penyusutan yaitu Window Function. Fitur ini umumnya digunakan pada prenkingan pada suatu kelompok. Untuk contoh codenya kira-kira seperti ini</p><pre>window_spec = Window.partitionBy(&quot;kategori&quot;).orderBy(col(&quot;pendapatan&quot;).desc())<br><br>df_ranked = df_transaksi.withColumn(&quot;rank_dalam_kategori&quot;, rank().over(window_spec))<br><br>df_ranked.filter(col(&quot;rank_dalam_kategori&quot;) &lt;= 2) \<br>    .orderBy(&quot;kategori&quot;, &quot;rank_dalam_kategori&quot;) \<br>    .show(10)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/682/1*6flibS3NPInxjPOnUmjH_A.png" /></figure><h3>Spark speaks multiple languages?</h3><p>Sebenarnya yang dimaksut disini bukan bahasa pemrograman tertentu melainkan 2 cara penulisan yang berbeda. Keunggulan ini membuat user dapat menuliskan query SQL secara langsung terhadap DataFrame sehingga user tidak perlu mengingat sintaks DataFrame API.</p><h4>Make a DataFrame first</h4><p>Membuat DataFrame dapat menjadi langkah yang dapat diselesaikan pertama kali. Pada percobaan kali ini, DataFrame akan dibuat dan didaftarkan ke tabel sementara atau temporary view. Untuk contoh kodenya kira-kira seperti ini :</p><pre>df_transaksi.createOrReplaceTempView(&quot;transaksi&quot;)<br>df_produk.createOrReplaceTempView(&quot;produk&quot;)<br><br>print(&quot;Kedua tabel sementara berhasil didaftarkan: &#39;transaksi&#39; dan &#39;produk&#39;&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/569/1*-A8UE783k_kUAyKcAFEvbQ.png" /></figure><h4>Run it</h4><p>Setelah membuat DataFrame sementara, langkah selanjutnya adalah menjalankannya. Untuk mencobanya cukup gunakan code ini :</p><pre>hasil_sql = spark.sql(&#39;&#39;&#39;<br>    SELECT t.kategori, p.manager, SUM(t.pendapatan) AS total_pendapatan<br>    FROM transaksi t<br>    JOIN produk p ON t.kategori = p.kategori<br>    GROUP BY t.kategori, p.manager<br>    ORDER BY total_pendapatan DESC<br>&#39;&#39;&#39;)<br>hasil_sql.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/527/1*sGXW_CzRFLLHB3jAZyAgRg.png" /></figure><h3>Try more</h3><p>Setelah mempelajari hal tersebut, terdapat beberapa hal yang dapat dicoba atau lebih tepatnya soal. Sebelum mengerjakannya, terdapat code yang perlu dijalankan</p><pre>spark = SparkSession.builder.appName(&quot;Latihan5&quot;).master(&quot;local[*]&quot;).getOrCreate()<br>spark.sparkContext.setLogLevel(&quot;ERROR&quot;)<br><br>np.random.seed(7)<br>df_produk = spark.createDataFrame(pd.DataFrame(data_produk))<br>df_transaksi = spark.createDataFrame(pd.DataFrame(data_transaksi))<br>df_transaksi.createOrReplaceTempView(&quot;transaksi&quot;)<br>df_produk.createOrReplaceTempView(&quot;produk&quot;)<br>print(&quot;Siap untuk latihan.&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/979/1*IyS3azM0OCs-XfUgtfgKdA.png" /></figure><h4>First</h4><blockquote>Menggunakan DataFrame API (join), tampilkan seluruh transaksi kota &quot;Solo&quot; beserta nama manager dari kategorinya masing-masing.</blockquote><p>Setelah menjalankan kode tersebut, soal pertama sudah dapat dijawab. Untuk jawabannya kira-kira seperti ini</p><pre>API = df_transaksi.filter(col(&quot;kota&quot;) == &quot;Solo&quot;)<br>API.join(df_produk, how=&quot;outer&quot;).show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/947/1*rPkccnkHEEteVnbkVgZnAA.png" /></figure><h4>Second</h4><blockquote>Menggunakan <strong>window function</strong>, tentukan transaksi dengan pendapatan <strong>tertinggi</strong> (peringkat 1 saja) di <strong>setiap kota</strong> (bukan kategori). tidak boleh menggunakan rank().</blockquote><p>Setelah menjawab soal tersebut, soal kedua sudah dapat dijawab. Untuk jawabannya kira-kira seperti ini</p><pre>window_spec = Window.partitionBy(&quot;kota&quot;).orderBy(col(&quot;pendapatan&quot;).desc())<br><br>df_ranked = df_transaksi.withColumn(&quot;rank_dalam_kategori&quot;, row_number().over(window_spec))<br><br><br>df_ranked.filter(col(&quot;rank_dalam_kategori&quot;) == 1) \<br>    .orderBy(&quot;kota&quot;, &quot;rank_dalam_kategori&quot;) \<br>    .show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/916/1*_xIHnLi1eZWpCdf7jiVYhw.png" /></figure><h4>Third</h4><blockquote>Menggunakan <strong>Spark SQL</strong> (bukan DataFrame API), tulis kueri untuk menghitung rata-rata pendapatan per kota, urutkan dari tertinggi.</blockquote><p>Setelah menjawab soal tersebut, soal ketiga sudah dapat dijawab. Untuk jawabannya kira-kira seperti ini</p><pre>df_transaksi.createOrReplaceTempView(&quot;transaksi&quot;)<br>df_produk.createOrReplaceTempView(&quot;produk&quot;)<br><br>sql = spark.sql(&#39;&#39;&#39;<br>    SELECT kota, AVG(pendapatan) AS rata_rata_kota<br>    FROM transaksi<br>    GROUP BY kota <br>    ORDER BY rata_rata_kota DESC<br>&#39;&#39;&#39;)<br>sql.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/980/1*uWVPQHR7G4gL3gyEQK8daQ.png" /></figure><h4>Four</h4><blockquote>Dalam 2–3 kalimat: menurut anda, dalam situasi seperti apa anda akan lebih memilih menulis Spark SQL dibanding DataFrame API pada pekerjaan anda nanti? Tulis jawaban pada markdown cell di bawah ini.</blockquote><p>Soal terahir ini bukanlah tentang coding, melainkan tentang pendapat pribadi. Untuk menjawabnya kira-kira seperti ini</p><pre>Situasi yang dinilai cocok untuk beralih menggunakan Spark SQL dari DataFrame <br>API adalah ketika ukuran data memungkinkan untuk diolah dengan cara yang <br>simpel. Umumnya, data yang disimpan menggunakan SQL memiliki ukuran yang bisa <br>dinilai wajar. Sementara data yang ada pada spark biasanya berukuran masif</pre><h3>Another try</h3><p>Setelah mengerjakan soal tersebut, ada beberapa soal lagi yang dapat dikerjakan. Namun sebelum mengerjakan soal tersebut, terdapat code yang perlu dijalankan terlebih dahulu</p><pre>import numpy as np<br>import pandas as pd<br><br># Tabel 1: Target &amp; PIC per cabang kota (tabel referensi, dibuat langsung sebagai DataFrame)<br>data_target_cabang = {<br>    &quot;kota&quot;: [&quot;Magelang&quot;, &quot;Yogyakarta&quot;, &quot;Semarang&quot;, &quot;Solo&quot;, &quot;Purworejo&quot;],<br>    &quot;target_bulanan&quot;: [45000000, 60000000, 55000000, 40000000, 30000000],<br>    &quot;pic_cabang&quot;: [&quot;Rani&quot;, &quot;Joko&quot;, &quot;Sari&quot;, &quot;Bayu&quot;, &quot;Fitri&quot;],<br>}<br><br># Tabel 2: Data transaksi (disimpan sebagai CSV, lalu diunggah ke HDFS)<br>np.random.seed(55)<br>n = 500<br>kategori_list = [&quot;Elektronik&quot;, &quot;Fashion&quot;, &quot;Makanan &amp; Minuman&quot;, &quot;Kesehatan &amp; Kecantikan&quot;, &quot;Rumah Tangga&quot;]<br>kota_list = [&quot;Magelang&quot;, &quot;Yogyakarta&quot;, &quot;Semarang&quot;, &quot;Solo&quot;, &quot;Purworejo&quot;]<br>data_transaksi_t5 = {<br>    &quot;order_id&quot;: [f&quot;TRX-{i}&quot; for i in range(n)],<br>    &quot;kategori&quot;: np.random.choice(kategori_list, size=n),<br>    &quot;kota&quot;: np.random.choice(kota_list, size=n),<br>    &quot;unit_terjual&quot;: np.random.randint(1, 10, size=n),<br>    &quot;harga_satuan&quot;: np.random.choice([25000, 50000, 75000, 100000, 150000], size=n),<br>}<br>pd.DataFrame(data_transaksi_t5).to_csv(&quot;transaksi_tugas5.csv&quot;, index=False)<br><br>!hdfs dfs -mkdir -p /home/plont/Documents/Big_Data/Tugas<br>!hdfs dfs -put -f transaksi_tugas5.csv /home/plont/Documents/Big_Data/Tugas<br>print(&quot;Dataset siap. Tabel transaksi sudah diunggah ke HDFS: home/plont/Documents/Big_Data/Tugas/transaksi_tugas5.csv&quot;)<br>print(&quot;Simpan juga &#39;data_target_cabang&#39; di atas — kalian akan membuatnya menjadi DataFrame sendiri di notebook tugas.&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/863/1*SHxpO3K5kai4R21AY_Ve_w.png" /></figure><h4>Fisrt</h4><blockquote>A. Join &amp; Perbandingan Target (bobot 25%)</blockquote><blockquote>Ringkas total pendapatan per kota dari df_transaksi, lalu join dengan df_target. Tambahkan kolom pencapaian_persen. Urutkan hasil dari pencapaian tertinggi.</blockquote><p>Setelah menjalankan code tersebut, soal pertama sudah dapat dikerjakan. Untuk jawabannya kira-kira seperti ini :</p><pre>from pyspark.sql import SparkSession<br>from pyspark.sql.functions import col, sum, round<br>import pandas as pd<br><br>spark = SparkSession.builder.appName(&quot;Tugas5&quot;).getOrCreate()<br><br>target_cabang = {<br>    &quot;kota&quot;: [&quot;Magelang&quot;, &quot;Yogyakarta&quot;, &quot;Semarang&quot;, &quot;Solo&quot;, &quot;Purworejo&quot;],<br>    &quot;target_bulanan&quot;: [45000000, 60000000, 55000000, 40000000, 30000000],<br>    &quot;pic_cabang&quot;: [&quot;Rani&quot;, &quot;Joko&quot;, &quot;Sari&quot;, &quot;Bayu&quot;, &quot;Fitri&quot;],<br>}<br>df_target = spark.createDataFrame(pd.DataFrame(target_cabang))<br><br>path_hdfs = &quot;/home/plont/Documents/Praktikum_Big_Data/tugas/transaksi_tugas5.csv&quot;<br>df_transaksi = spark.read.csv(path_hdfs, header=True, inferSchema=True)<br><br>df_transaksi = df_transaksi.withColumn(&quot;pendapatan&quot;, col(&quot;unit_terjual&quot;) * col(&quot;harga_satuan&quot;))<br>df_pendapatan_kota = df_transaksi.groupBy(&quot;kota&quot;).agg(sum(&quot;pendapatan&quot;).alias(&quot;total_pendapatan&quot;))<br><br>df_hasil = df_pendapatan_kota.join(df_target, on=&quot;kota&quot;, how=&quot;inner&quot;) \<br>    .withColumn(&quot;pencapaian_persen&quot;, round((col(&quot;total_pendapatan&quot;) / col(&quot;target_bulanan&quot;)) * 100, 2)) \<br>    .orderBy(col(&quot;pencapaian_persen&quot;).desc())<br><br>df_hasil.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/966/1*VFzK81Poyl9SkKZ9jcWMMQ.png" /></figure><h4>Second</h4><blockquote><strong>B. Window Function — Kategori Terlaris per Kota</strong> <em>(bobot 25%)</em></blockquote><blockquote>Menggunakan window function, tentukan <strong>kategori dengan pendapatan tertinggi di setiap kota</strong> (top-1 saja, gunakan row_number()).</blockquote><p>Setelah mengerjakan soal pertama, soal kedua sudah dapat dikerjakan. Untuk jawabannya kira-kira seperti ini :</p><pre>from pyspark.sql.window import Window<br>from pyspark.sql import SparkSession<br>from pyspark.sql.functions import col, sum as spark_sum, avg, count, rank, row_number, when, expr, col, sum<br><br>spark = SparkSession.builder \<br>    .appName(&quot;transaksi_tugas5&quot;) \<br>    .getOrCreate()<br><br>!hdfs dfs -get /home/plont/Documents/Praktikum_Big_Data/tugas/transaksi_tugas5.csv transaksi.csv<br><br>df = pd.read_csv(&quot;transaksi.csv&quot;)<br><br>dtf = spark.createDataFrame(pd.DataFrame(df))<br><br>df_pendapatan = dtf.groupBy(&quot;kota&quot;, &quot;kategori&quot;) \<br>                  .agg(expr(&quot;sum(unit_terjual * harga_satuan)&quot;).alias(&quot;total_pendapatan&quot;))<br><br>windowSpec = Window.partitionBy(&quot;kota&quot;).orderBy(col(&quot;total_pendapatan&quot;).desc())<br><br>df_tertinggi = df_pendapatan.withColumn(&quot;rn&quot;, row_number().over(windowSpec)) \<br>                            .filter(col(&quot;rn&quot;) == 1) \<br>                            .drop(&quot;rn&quot;)<br><br>df_tertinggi.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/971/1*XoPhzfzAhHRamn9QeZYvzQ.png" /></figure><h4>Third</h4><blockquote><strong>C. Spark SQL</strong> <em>(bobot 25%)</em></blockquote><blockquote>Daftarkan df_transaksi dan df_target sebagai <em>temporary view</em>, lalu <strong>tulis satu kueri SQL</strong> (bukan DataFrame API) yang menampilkan: kota, pic_cabang, dan jumlah transaksi (COUNT) di kota tersebut, diurutkan dari jumlah transaksi terbanyak.</blockquote><p>Setelah mengerjakan soal kedua, soal ketiga sudah dapat dikerjakan. Untuk jawabannya kira-kira seperti ini :</p><pre>df_transaksi.createOrReplaceTempView(&quot;transaksi&quot;)<br>df_target.createOrReplaceTempView(&quot;target&quot;)<br><br>spark.sql(&quot;&quot;&quot;<br>    SELECT <br>        transaksi.kota, <br>        target.pic_cabang, <br>        COUNT(transaksi.order_id) AS jumlah_transaksi<br>    FROM transaksi <br>    JOIN target ON transaksi.kota = target.kota<br>    GROUP BY transaksi.kota, target.pic_cabang<br>    ORDER BY jumlah_transaksi DESC<br>&quot;&quot;&quot;).show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/985/1*kDbkxFbWv0Wt1uPUiSS8Rw.png" /></figure><h4>Four</h4><blockquote><strong>D. Kesimpulan</strong> <em>(bobot 25%)</em></blockquote><blockquote>Tulis pada markdown cell (<strong>minimal 100 kata</strong>): berdasarkan hasil bagian A dan B, <strong>cabang mana yang berkinerja paling baik</strong> dan <strong>cabang mana yang paling perlu perhatian manajemen</strong>? Sertakan angka-angka pendukung dari hasil analisis kalian, bukan opini tanpa dasar data.</blockquote><p>Setelah mengerjakan soal ketiga, soal keempat sudah dapat dikerjakan. Untuk jawabannya kira-kira seperti ini :</p><pre>Menurut data yang dihasilkan dari code bagian A dan code bagian B, cabang yang <br>memiliki kinerja paling baik jika dihitung dari target bulanan adalah cabang <br>yang berada di kota purworejo dengan Fitri sebagai penanggung jawab telah <br>pencapaian mencapai 152.17 persen, jauh melampaui cabang lain. Cabang <br>dibawahnya hanya mampu mencapai 83.69 persen saja, jarak antar keduanya bahkan <br>mencapai 68.48 persen, hampir mendekati target dari cabang terendah.<br><br>Menurut data yang dihasilkan dari code bagian A dan code bagian B, cabang yang <br>masih perlu diatur atau di manajemen lagi adalah cabang yang berada di kota <br>semarang dengan Sari sebagai penanggung jawab. Target yang berhasil dipenuhi <br>cabang ini hanya sekitar 69.41 persen, dinilai cukup jauh dari target yang <br>telah ditetapkan yaitu cabang ini masih perlu memenuhi 16825000.</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1011/1*5CjmcWiDKU2H0dyCyHGs9Q.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9e650e72bf4c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build your own topology, but make it wireless]]></title>
            <link>https://medium.com/@Akmal_Zidan/build-your-own-topology-but-make-it-wireless-03ed4a7d8a09?source=rss-d99b42184d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/03ed4a7d8a09</guid>
            <category><![CDATA[cisco-packet-tracer]]></category>
            <category><![CDATA[wireless]]></category>
            <dc:creator><![CDATA[Zidane Arrizqi Akmal]]></dc:creator>
            <pubDate>Tue, 22 Sep 2026 09:08:09 GMT</pubDate>
            <atom:updated>2026-09-22T09:08:09.602Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*9PNs6LMBKSvmcWMr" /><figcaption>Photo by <a href="https://unsplash.com/@pkumar26?utm_source=medium&amp;utm_medium=referral">Praveen kumar Mathivanan</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Terkadang, terdapat sebuah pertanyaan random seperti “Bagaimana cara mengatur Wi-Fi?” Well, hal ini bisa dilakukan di software bernama Cisco Packet Tracer</p><h3>How?</h3><p>Sebagai awalan, software yang akan digunakan adalah Cisco Packet Tracer. Singkatnya, ini merupakan sebuah software yang berfungsi untuk membuat simulasi jaringan secara visual, software ini umumnya digunakan untuk membantu dalam merancang, mengkonfigurasi serta memecahkan masalah topologi jaringan tanpa perangkat kerasnya sama sekali.</p><p>Sebagai langkah pertama, hal yang perlu dilakukan adalah mengumpulkan berbagai perangkat yang akan digunakan. Terdapat sekitar 8 perangkat yang diperlukan untuk membuat sistem wireless yaitu</p><ul><li>Laptop berjumlah 1 dengan peran sebagai Admin</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/867/1*UB-AHvXnL20Q_v2a7gOcOw.png" /></figure><ul><li>PC berjumlah 1 dengan peran sebagai Client</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/863/1*V4dcQWJ1Z0vfBaFKGKX5Cg.png" /></figure><ul><li>Tablet berjumlah 1 dengan peran sebagai Client</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/849/1*QhGCm_rbl3xb2PZ-ft66CA.png" /></figure><ul><li>Ponsel berjumlah 1 dengan peran sebagai Client</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/853/1*Oq3j_vz1HYDWZ_6N7l5n3Q.png" /></figure><ul><li>Printer berjumlah 1 dengan peran sebagai Client</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/858/1*sbW56UmQix4pTBZ5l592Ew.png" /></figure><ul><li>Wireless dervice berjumlah 1 dengan tipe WRT300N yang merupakan simulasi dari perangkat router Linksys WRT300N Wireless-N Broadband Router.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/855/1*tCTz18_BAPAjIr4_iro9uA.png" /></figure><h4>Connect via wired</h4><p>Sebagai permulaan, Hubungkan laptop dengan WRT300N dengan kabel copper straight-trought melewati port FastEthernet0 yang ada pada Laptop dengan port Ethernet 1</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/307/1*sL9ksRhB7QCFZM-AhclgKw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/319/1*lWdyH4o80i9TDgdkQGSGhg.png" /></figure><h4>Configure the laptop</h4><p>Setelah menghubungkan perangkat laptop dengan perangkat router WRT300N, langkah selanjuntya adalah melakukan konfigurasi pada Laptop yang akan digunakan sebagai laptop administrator. Untuk melakukannya, klik LMB 2 kali pada perangkat Laptop lalu cari sub menu <em>IP configuration</em> pada menu <em>Dekstop</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4osTBpUGD5zinp1koM3iPg.png" /></figure><p>Setelah menemukan menu tersebut, langkah selanjutnya adalah mengubah sistemnya dari Static menjadi DHCP</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Eimqj4uYK7tbz_09ZqaMuA.png" /></figure><p>Setelah selesai, langkah selanjutnya adalah lakukan uji coba dengan membuka Command Promt pada laptop tersebut dan gunakan command ini</p><pre># untuk melihat ip<br>ipconfig<br><br># untuk melakukan uji koneksi<br>ping 192.168.54.1</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xyKm6L_5Mn7qiS-THcP6sw.png" /></figure><h4>Wireless Router Configuration</h4><p>Langkah selanjutnya adalah melakukan konfigurasi perangjat WRT300N. Standarnya, dalam mengkonfigurasi wireless router, terdapat 2 hal yang perlu dikonfigurasi yaitu konfigurasi keamanan dan konfigurasi IP address. Untuk melakukannya, klik LMB 2 kali pada laptop dan cari sub menu <em>Web Browser</em> yang dapat ditemukan pada menu <em>Dekstop</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vAT8cEUsb3UJOGJucL56Bg.png" /></figure><p>Lalu pada menu pencarian masukkan IP address lalu tekan ENTER. Lalu akan muncul tampilan yang meminta user untuk memasukkan username dan password. Secara default, router WRT300N memiliki username dan password default yang sama yaitu <em>admin</em></p><pre>http://192.168.54.1</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oDXLRGyz-u1hWIsWO1cx_A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XMP5qhDVpzXuHX7MM_MtXA.png" /></figure><p>Setelah berhasil masuk ke menu tersebut, bagian ini adalah konfigurasi router tersebut. Untuk melakukannya, ada beberapa yang harus diatur antara lain mengatur network name (SSID), mengatur SSID Broadcast, Security mode, encryption dan passphrase. Untuk melakukannya klik pada menu <em>wireless </em>dan masukkan<em> Network Name</em> dan Ubah<em> SSID Broadcast</em> menjadi <em>Enable </em>lalu scroll kebawah sampai menemukan tombol <em>Save setting</em>. Setelah itu, cari sub menu <em>Wireless Security</em> dan ubah <em>Security mode</em> menjadi WPA2 Personal, Pilih enkripsi menjadi <em>AES</em> dan Passphrase bebas. Sebagai contoh kira-kira seperti ini</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n9b8Ujwk1pbxAHaXgCWNCA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rutm-RpHZaIPasQNIPDJMA.png" /></figure><p>Setelah selesai melakukan penyetelan pada bagian wireless. Langkah selanjutnya adalah masuk ke menu setup dan masuk ke menu basic setup dan lakukan penyetelan pada IP address, subnetmask, DHCP, start IP address dan Maximum number of Users, setelah selesai scroll ke bawah sampai menemukan tombol untuk melakukan save. Sebagai contoh kira-kira seperti ini</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SQwqzjwIXJy5D_mEldGQDg.png" /></figure><p>Setelah berhasil melakukan konfigurasi, langkah selnajutnya adalah adalah menyetel ulang DHCP pada laptop tersebut dengan masuk ke menu IP configuration, ubah ke static lalu ubah kembali ke DHCP.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*z2XpJWulaBQT2Xca68j3aA.png" /></figure><p>Setelah berhasil melakukan konfigurasi ulang, langkah selanjutnya adalah melakukan pengujian dengan masuk ke Command Promt dan masukkan command yang sama.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/519/1*kOPEnYbIYOrAN3aiQc2S2A.png" /></figure><h4>Configure the PC client</h4><p>Setelah melakukan konfigurasi pada Router, langkah selanjutnya adalah melakukan konfigurasi pada perangkat client. Sebagai awalan, klik LMB 2 kali pada PC hingga masuk ke menu <em>Physical</em>. Sebagai awalan, matikan terlebih dahulu PC tersebut dengan menekan tombol merah.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/703/1*6kJZk6gwrIA8gZ_jHW4uWg.png" /></figure><p>Setelah selesai buang port yang ada pada kotak tersebut dan buang ke kolom disamping dengan melakukan drag and drop. Setelah itu drag module bernama WMP300N ke kotak tersebut lalu nyalakan kembali dengan menekan tombol merah hingga lampu hijau menyala</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/613/1*ELqIUBBxRChJ-ucaMKfvqg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/612/1*nhNyxSOE1n8rRQcu7DRjPg.png" /></figure><p>Setelah mengganti port tersebut, langkah selanjutnya adalah masuk ke menu <em>PC wireless </em>yang berada pada menu <em>Dekstop.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AafTPMvodmL_Zsuz0fqLRw.png" /></figure><p>Pada menu tersebut, masuk ke menu koneksi, refresh dan tekan <em>Connect </em>pada menu tersebut. Lalu pada menu tersebut, masukkan pre-shared key dengan passphrase yang sebelumnya telah dibuat. Jika sudah selesai, tekan connect.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/590/1*_JcXHd6v6a429bSDiIuKXg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/531/1*JDjGpcp7L1XWgoYEKYFo5w.png" /></figure><p>Setelah selesai, masuk ke menu <em>IP configuration</em> yang ada pada dekstop dan ubah dari Static menjadi DHCP.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/882/1*x8JdGN1IO_zvEKmV3kphNQ.png" /></figure><p>Setelah berhasil melakukan konfigurasi tanpa maslaah, langkah selanjutnya adalah menlakukan pengujian dengan memasukkan command yang sama pada Command Promt</p><pre># untuk melihat ip<br>ipconfig<br><br># untuk melakukan uji koneksi ke perangkat router<br>ping 192.168.54.1<br><br># untuk melakukan uji koneksi ke laptop administrator<br>ping 192.168.54.10</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/523/1*NKyaB4H0o01uXL65u-FwAQ.png" /></figure><h4>Configure the printer client</h4><p>Setelah melakukan konfigurasi pada PC client, langkah selanjutnya adalah melakukan konfigurasi pada perangkat printer. Untuk melakukannya, klik LMB 2 kali pada printer. Setelah muncul menu <em>Physical</em>, langkah selanjutnya adalah matikan printer dengan menekan tombol hijau sampai lampu indikator tersebut mati. Setelah mematikan printer, langkah selanjuntya adalah mengganti port RJ45 tersebut dengan melakukan drag and drop pada kolom di sisi kiri dan ganti dengan menggunakan modul <em>WMP300N </em>dan nyalakan kembali printer tersebut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/989/1*Uu_Dt3c86xUuCdlPiUEQCA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*NEFbEeQUs2CViECmlUFBZg.png" /></figure><p>Setelah mengganti module, langkah selanjutnya adalah melakukan konfigurasi pada printer. Cari menu Wireless0 dan ubah SSID sesuai dengan yang sebelumnya telah dibuat, ubah autentikasi menjadi WPA2-PSK, isi PSK PassPhrase sesuai dengan yang dibuat sebelumnya, ubah IP configuration menjadi DHCP. Sebagai contoh kira-kira seperti ini</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8zOuZKYPKhj5cM2tXF4zxA.png" /></figure><h4>Configure the tablet</h4><p>Langkah selanjutnya yang dapat diselesaikan adalah melakukan konfigurasi pada tablet. Untuk melakukannya, cari menu yang sama seperti printer yaitu menu <em>Wireless0</em>. Gunakan setelan yang sama seperti printer</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*z8Z0FSX3MtR38oqwezeVMA.png" /></figure><p>Setelah melakukan penyetelan, langkah selanjutnya adalah melakukan pengetesan apakah tablet telah terkoneksi dengan sempurna. Untuk melakukannya, cari Command Promt dan gunakan command yang sama</p><pre># untuk melihat ip<br>ipconfig<br><br># untuk melakukan uji koneksi ke perangkat router<br>ping 192.168.54.1<br><br># untuk melakukan uji koneksi ke laptop administrator<br>ping 192.168.54.10<br><br># untuk melakukan uji koneksi ke printer<br>ping 192.168.54.12</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/470/1*32BklcKolSvpMG61kfr63A.png" /></figure><h4>Configure the smartphone</h4><p>Langkah selanjutnya yang dapat diselesaikan adalah melakukan konfigurasi pada ponsel. Untuk melakukannya, cari menu yang sama seperti printer yaitu menu <em>Wireless0</em>. Gunakan setelan yang sama seperti printer</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m2AcucudjEruJF1bY93FLg.png" /></figure><p>Setelah selesai melakukan konfigurasi, langkah selanjutnya adalah melakukan uji coba dengan command yang sama</p><pre># untuk melihat ip<br>ipconfig<br><br># untuk melakukan uji koneksi ke perangkat router<br>ping 192.168.54.1<br><br># untuk melakukan uji koneksi ke laptop administrator<br>ping 192.168.54.10<br><br># untuk melakukan uji koneksi ke printer<br>ping 192.168.54.12<br><br># untuk melakukan uji koneksi ke tablet<br>ping 192.168.54.13</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/527/1*mSLK_H_GgCfvuTMUkX4x5g.png" /></figure><p>Sebagai penutup, lakukan uji koneksi ke berbagai perangkat menggunakan Laptop Administrator. Cukup gunakan command yang sama</p><pre># untuk melihat ip<br>ipconfig<br><br># untuk melakukan uji koneksi ke perangkat router<br>ping 192.168.54.1<br><br># untuk melakukan uji koneksi ke printer<br>ping 192.168.54.12<br><br># untuk melakukan uji koneksi ke tablet<br>ping 192.168.54.13<br><br># untuk melakukan uji koneksi ke ponsel<br>ping 192.168.54.15</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/497/1*HdhI5nikl7DYte9_QGuOpw.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=03ed4a7d8a09" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>