Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Pertanyaan Wawancara Insinyur Data Dengan Python

Pergi ke wawancara bisa menjadi proses yang memakan waktu dan melelahkan, dan wawancara teknis bisa lebih membuat stres! Tutorial ini bertujuan untuk mempersiapkan Anda untuk beberapa pertanyaan umum yang akan Anda temui selama wawancara insinyur data Anda. Anda akan mempelajari cara menjawab pertanyaan tentang database, Python, dan SQL.

Di akhir tutorial ini, Anda akan dapat:

  • Pahami pertanyaan wawancara insinyur data umum
  • Membedakan database relasional dan non-relasional
  • Menyiapkan database menggunakan Python
  • Gunakan Python untuk mengkueri data

Unduhan Gratis: Dapatkan contoh bab dari Trik Python:Buku yang menunjukkan praktik terbaik Python dengan contoh sederhana yang dapat Anda terapkan secara instan untuk menulis kode + Python yang lebih indah.


Menjadi Insinyur Data

Peran rekayasa data bisa sangat luas dan beragam. Anda harus memiliki pengetahuan tentang berbagai teknologi dan konsep. Insinyur data fleksibel dalam pemikiran mereka. Hasilnya, mereka bisa mahir dalam berbagai topik, seperti database, pengembangan perangkat lunak, DevOps, dan data besar.


Apa yang Dilakukan Insinyur Data?

Mengingat keahliannya yang bervariasi, peran rekayasa data dapat menjangkau banyak deskripsi pekerjaan yang berbeda. Seorang insinyur data dapat bertanggung jawab untuk desain database, desain skema, dan membuat beberapa solusi database. Pekerjaan ini mungkin juga melibatkan Administrator Basis Data.

Sebagai perekayasa data , Anda dapat bertindak sebagai jembatan antara database dan tim ilmu data. Dalam hal ini, Anda juga akan bertanggung jawab untuk pembersihan dan persiapan data. Jika data besar terlibat, maka tugas Anda adalah memberikan solusi yang efisien untuk data tersebut. Pekerjaan ini dapat tumpang tindih dengan peran DevOps.

Anda juga harus membuat kueri data yang efisien untuk pelaporan dan analisis. Anda mungkin perlu berinteraksi dengan beberapa database atau menulis Prosedur Tersimpan. Untuk banyak solusi seperti situs web atau layanan dengan lalu lintas tinggi, mungkin ada lebih dari satu database yang ada. Dalam kasus ini, insinyur data bertanggung jawab untuk menyiapkan database, memeliharanya, dan mentransfer data di antara mereka.



Bagaimana Python Dapat Membantu Data Engineer?

Python dikenal sebagai pisau tentara swiss dari bahasa pemrograman. Ini sangat berguna dalam ilmu data, sistem backend, dan skrip sisi server. Itu karena Python memiliki pengetikan yang kuat, sintaksis yang sederhana, dan banyak perpustakaan pihak ketiga untuk digunakan. Pandas, SciPy, Tensorflow, SQLAlchemy, dan NumPy adalah beberapa library yang paling banyak digunakan dalam produksi di berbagai industri.

Yang terpenting, Python mengurangi waktu pengembangan, yang berarti lebih sedikit pengeluaran untuk perusahaan. Untuk seorang insinyur data, sebagian besar eksekusi kode terikat pada basis data, bukan terikat pada CPU. Karena itu, masuk akal untuk memanfaatkan kesederhanaan Python, bahkan dengan mengorbankan kinerja yang lebih lambat jika dibandingkan dengan bahasa yang dikompilasi seperti C# dan Java.




Menjawab Pertanyaan Wawancara Insinyur Data

Sekarang setelah Anda tahu apa peran Anda, inilah saatnya untuk belajar bagaimana menjawab beberapa pertanyaan wawancara insinyur data! Meskipun ada banyak hal yang harus dibahas, Anda akan melihat contoh Python praktis di seluruh tutorial untuk memandu Anda di sepanjang jalan.



Pertanyaan tentang Basis Data Relasional

Database merupakan salah satu komponen terpenting dalam sebuah sistem. Tanpa mereka, tidak akan ada negara dan tidak ada sejarah. Meskipun Anda mungkin tidak menganggap desain database sebagai prioritas, ketahuilah bahwa itu dapat berdampak signifikan pada seberapa cepat halaman Anda dimuat. Dalam beberapa tahun terakhir, beberapa perusahaan besar telah memperkenalkan beberapa alat dan teknik baru:

  • NoSQL
  • Database cache
  • Basis data grafik
  • Dukungan NoSQL dalam database SQL

Ini dan teknik lainnya diciptakan untuk mencoba dan meningkatkan kecepatan di mana database memproses permintaan. Anda mungkin perlu membicarakan konsep-konsep ini dalam wawancara insinyur data Anda, jadi mari kita bahas beberapa pertanyaan!


Q1:Basis Data Relasional vs Non-Relasional

Database relasional adalah salah satu tempat data disimpan dalam bentuk tabel. Setiap tabel memiliki skema , yang merupakan kolom dan jenis catatan yang harus dimiliki. Setiap skema harus memiliki setidaknya satu kunci utama yang secara unik mengidentifikasi catatan itu. Dengan kata lain, tidak ada baris duplikat di database Anda. Selain itu, setiap tabel dapat dihubungkan dengan tabel lain menggunakan kunci asing.

Salah satu aspek penting dari database relasional adalah bahwa perubahan skema harus diterapkan ke semua record. Ini terkadang dapat menyebabkan kerusakan dan sakit kepala hebat selama migrasi. Basis data non-relasional menangani hal-hal dengan cara yang berbeda. Mereka secara inheren tanpa skema, yang berarti bahwa catatan dapat disimpan dengan skema yang berbeda dan dengan struktur bersarang yang berbeda. Rekaman masih dapat memiliki kunci utama, tetapi perubahan skema dilakukan berdasarkan entri demi entri.

Anda perlu melakukan tes perbandingan kecepatan berdasarkan jenis fungsi yang dilakukan. Anda dapat memilih INSERT , UPDATE , DELETE , atau fungsi lainnya. Desain skema, indeks, jumlah agregasi, dan jumlah rekaman juga akan memengaruhi analisis ini, jadi Anda harus mengujinya secara menyeluruh. Anda akan mempelajari lebih lanjut tentang cara melakukannya nanti.

Basis data juga berbeda dalam skalabilitas . Basis data non-relasional mungkin tidak terlalu merepotkan untuk didistribusikan. Itu karena kumpulan catatan terkait dapat dengan mudah disimpan di node tertentu. Di sisi lain, database relasional membutuhkan lebih banyak pemikiran dan biasanya menggunakan sistem master-slave.



Contoh SQLite

Sekarang setelah Anda menjawab apa itu database relasional, saatnya untuk menggali lebih dalam tentang Python! SQLite adalah database yang nyaman yang dapat Anda gunakan pada mesin lokal Anda. Basis data adalah satu file, yang membuatnya ideal untuk tujuan pembuatan prototipe. Pertama, impor pustaka Python yang diperlukan dan buat database baru:

import sqlite3

db = sqlite3.connect(':memory:')  # Using an in-memory database
cur = db.cursor()

Anda sekarang terhubung ke database dalam memori dan objek kursor Anda siap digunakan.

Selanjutnya, Anda akan membuat tiga tabel berikut:

  1. Pelanggan: Tabel ini akan berisi kunci utama serta nama depan dan belakang pelanggan.
  2. Item: Tabel ini akan berisi kunci utama, nama item, dan harga item.
  3. Barang yang Dibeli :Tabel ini akan berisi nomor pesanan, tanggal, dan harga. Itu juga akan terhubung ke kunci utama di tabel Item dan Pelanggan.

Sekarang setelah Anda memiliki gambaran seperti apa tabel Anda nantinya, Anda dapat melanjutkan dan membuatnya:

cur.execute('''CREATE TABLE IF NOT EXISTS Customer (
                id integer PRIMARY KEY,
                firstname varchar(255),
                lastname varchar(255) )''')
cur.execute('''CREATE TABLE IF NOT EXISTS Item (
                id integer PRIMARY KEY,
                title varchar(255),
                price decimal )''')
cur.execute('''CREATE TABLE IF NOT EXISTS BoughtItem (
                ordernumber integer PRIMARY KEY,
                customerid integer,
                itemid integer,
                price decimal,
                CONSTRAINT customerid
                    FOREIGN KEY (customerid) REFERENCES Customer(id),
                CONSTRAINT itemid
                    FOREIGN KEY (itemid) REFERENCES Item(id) )''')

Anda telah mengirimkan kueri ke cur.execute() untuk membuat tiga tabel Anda.

Langkah terakhir adalah mengisi tabel Anda dengan data:

cur.execute('''INSERT INTO Customer(firstname, lastname)
               VALUES ('Bob', 'Adams'),
                      ('Amy', 'Smith'),
                      ('Rob', 'Bennet');''')
cur.execute('''INSERT INTO Item(title, price)
               VALUES ('USB', 10.2),
                      ('Mouse', 12.23),
                      ('Monitor', 199.99);''')
cur.execute('''INSERT INTO BoughtItem(customerid, itemid, price)
               VALUES (1, 1, 10.2),
                      (1, 2, 12.23),
                      (1, 3, 199.99),
                      (2, 3, 180.00),
                      (3, 2, 11.23);''') # Discounted price 

Sekarang setelah ada beberapa catatan di setiap tabel, Anda dapat menggunakan data ini untuk menjawab beberapa pertanyaan wawancara insinyur data lagi.



Q2:Fungsi Agregasi SQL

Fungsi agregasi adalah mereka yang melakukan operasi matematika pada himpunan hasil. Beberapa contoh termasuk AVG , COUNT , MIN , MAX , dan SUM . Seringkali, Anda memerlukan GROUP BY dan HAVING klausa untuk melengkapi agregasi ini. Satu fungsi agregasi yang berguna adalah AVG , yang dapat Anda gunakan untuk menghitung rata-rata dari kumpulan hasil yang diberikan:

>>>
>>> cur.execute('''SELECT itemid, AVG(price) FROM BoughtItem GROUP BY itemid''')
>>> print(cur.fetchall())
[(1, 10.2), (2, 11.73), (3, 189.995)]

Di sini, Anda telah mendapatkan harga rata-rata untuk setiap item yang dibeli di database Anda. Anda dapat melihat bahwa item dengan itemid dari 1 memiliki harga rata-rata $10,20.

Untuk membuat output di atas lebih mudah dipahami, Anda dapat menampilkan nama item sebagai ganti itemid :

>>>
>>> cur.execute('''SELECT item.title, AVG(boughtitem.price) FROM BoughtItem as boughtitem
...             INNER JOIN Item as item on (item.id = boughtitem.itemid)
...             GROUP BY boughtitem.itemid''')
...
>>> print(cur.fetchall())
[('USB', 10.2), ('Mouse', 11.73), ('Monitor', 189.995)]

Sekarang, Anda lebih mudah melihat bahwa barang dengan harga rata-rata $10,20 adalah USB .

Agregasi lain yang berguna adalah SUM . Anda dapat menggunakan fungsi ini untuk menampilkan jumlah total uang yang dibelanjakan setiap pelanggan:

>>>
>>> cur.execute('''SELECT customer.firstname, SUM(boughtitem.price) FROM BoughtItem as boughtitem
...             INNER JOIN Customer as customer on (customer.id = boughtitem.customerid)
...             GROUP BY customer.firstname''')
...
>>> print(cur.fetchall())
[('Amy', 180), ('Bob', 222.42000000000002), ('Rob', 11.23)]

Rata-rata, pelanggan bernama Amy menghabiskan sekitar $180, sedangkan Rob hanya menghabiskan $11,23!

Jika pewawancara Anda menyukai database, maka Anda mungkin ingin memoles kueri bersarang, menggabungkan jenis, dan langkah-langkah yang dilakukan database relasional untuk melakukan kueri Anda.



Q3:Mempercepat Kueri SQL

Kecepatan bergantung pada berbagai faktor, tetapi sebagian besar dipengaruhi oleh berapa banyak dari masing-masing hal berikut yang ada:

  • Bergabung
  • Agregasi
  • Perjalanan
  • Catatan

Semakin besar jumlah join, semakin tinggi kompleksitas dan semakin besar jumlah traversal dalam tabel. Beberapa gabungan cukup mahal untuk dilakukan pada beberapa ribu catatan yang melibatkan beberapa tabel karena database juga perlu menyimpan hasil antara! Pada titik ini, Anda mungkin mulai berpikir tentang cara meningkatkan ukuran memori.

Kecepatan juga dipengaruhi oleh ada atau tidaknya indeks hadir dalam database. Indeks sangat penting dan memungkinkan Anda menelusuri tabel dengan cepat dan menemukan kecocokan untuk beberapa kolom yang ditentukan dalam kueri.

Indeks mengurutkan catatan dengan biaya waktu penyisipan yang lebih tinggi, serta beberapa penyimpanan. Beberapa kolom dapat digabungkan untuk membuat satu indeks. Misalnya, kolom date dan price mungkin digabungkan karena kueri Anda bergantung pada kedua kondisi.



Q4:Men-debug Kueri SQL

Sebagian besar basis data menyertakan EXPLAIN QUERY PLAN yang menjelaskan langkah-langkah yang diambil database untuk mengeksekusi kueri. Untuk SQLite, Anda dapat mengaktifkan fungsi ini dengan menambahkan EXPLAIN QUERY PLAN di depan SELECT pernyataan:

>>>
>>> cur.execute('''EXPLAIN QUERY PLAN SELECT customer.firstname, item.title, 
...                item.price, boughtitem.price FROM BoughtItem as boughtitem
...                INNER JOIN Customer as customer on (customer.id = boughtitem.customerid)
...                INNER JOIN Item as item on (item.id = boughtitem.itemid)''')
...
>>> print(cur.fetchall())
[(4, 0, 0, 'SCAN TABLE BoughtItem AS boughtitem'), 
(6, 0, 0, 'SEARCH TABLE Customer AS customer USING INTEGER PRIMARY KEY (rowid=?)'), 
(9, 0, 0, 'SEARCH TABLE Item AS item USING INTEGER PRIMARY KEY (rowid=?)')]

Kueri ini mencoba mencantumkan nama depan, judul item, harga asli, dan harga beli untuk semua item yang dibeli.

Begini tampilan paket kueri itu sendiri:

SCAN TABLE BoughtItem AS boughtitem
SEARCH TABLE Customer AS customer USING INTEGER PRIMARY KEY (rowid=?)
SEARCH TABLE Item AS item USING INTEGER PRIMARY KEY (rowid=?)

Perhatikan bahwa pernyataan fetch dalam kode Python Anda hanya mengembalikan penjelasan, tetapi bukan hasilnya. Itu karena EXPLAIN QUERY PLAN tidak dimaksudkan untuk digunakan dalam produksi.




Pertanyaan tentang Basis Data Non-Relasional

Di bagian sebelumnya, Anda menjelaskan perbedaan antara database relasional dan non-relasional dan menggunakan SQLite dengan Python. Sekarang Anda akan fokus pada NoSQL. Tujuan Anda adalah untuk menyoroti kekuatan, perbedaan, dan kasus penggunaannya.


Contoh MongoDB

Anda akan menggunakan data yang sama seperti sebelumnya, tetapi kali ini database Anda adalah MongoDB. Basis data NoSQL ini berbasis dokumen dan berskala sangat baik. Hal pertama yang pertama, Anda harus menginstal pustaka Python yang diperlukan:

$ pip install pymongo

Anda juga mungkin ingin menginstal Komunitas Kompas MongoDB. Ini termasuk IDE lokal yang sempurna untuk memvisualisasikan database. Dengannya, Anda dapat melihat catatan yang dibuat, membuat pemicu, dan bertindak sebagai admin visual untuk database.

Catatan: Untuk menjalankan kode di bagian ini, Anda memerlukan server database yang berjalan. Untuk mempelajari lebih lanjut tentang cara menyiapkannya, lihat Pengantar MongoDB dan Python.

Inilah cara Anda membuat database dan memasukkan beberapa data:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")

# Note: This database is not created until it is populated by some data
db = client["example_database"]

customers = db["customers"]
items = db["items"]

customers_data = [{ "firstname": "Bob", "lastname": "Adams" },
                  { "firstname": "Amy", "lastname": "Smith" },
                  { "firstname": "Rob", "lastname": "Bennet" },]
items_data = [{ "title": "USB", "price": 10.2 },
              { "title": "Mouse", "price": 12.23 },
              { "title": "Monitor", "price": 199.99 },]

customers.insert_many(customers_data)
items.insert_many(items_data)

Seperti yang mungkin Anda perhatikan, MongoDB menyimpan catatan data di koleksi , yang setara dengan daftar kamus dengan Python. Dalam praktiknya, MongoDB menyimpan dokumen BSON.



Q5:Membuat Kueri Data Dengan MongoDB

Mari kita coba meniru BoughtItem tabel terlebih dahulu, seperti yang Anda lakukan di SQL. Untuk melakukan ini, Anda harus menambahkan bidang baru ke pelanggan. Dokumentasi MongoDB menetapkan bahwa operator kata kunci set dapat digunakan untuk memperbarui catatan tanpa harus menulis semua bidang yang ada:

# Just add "boughtitems" to the customer where the firstname is Bob
bob = customers.update_many(
        {"firstname": "Bob"},
        {
            "$set": {
                "boughtitems": [
                    {
                        "title": "USB",
                        "price": 10.2,
                        "currency": "EUR",
                        "notes": "Customer wants it delivered via FedEx",
                        "original_item_id": 1
                    }
                ]
            },
        }
    )

Perhatikan bagaimana Anda menambahkan bidang tambahan ke customer tanpa secara eksplisit mendefinisikan skema sebelumnya. Bagus!

Bahkan, Anda dapat memperbarui pelanggan lain dengan skema yang sedikit diubah:

amy = customers.update_many(
        {"firstname": "Amy"},
        {
            "$set": {
                "boughtitems":[
                    {
                        "title": "Monitor",
                        "price": 199.99,
                        "original_item_id": 3,
                        "discounted": False
                    }
                ]
            } ,
        }
    )
print(type(amy))  # pymongo.results.UpdateResult

Mirip dengan SQL, database berbasis dokumen juga memungkinkan query dan agregasi untuk dieksekusi. Namun, fungsionalitasnya dapat berbeda baik secara sintaksis maupun dalam eksekusi yang mendasarinya. Bahkan, Anda mungkin telah memperhatikan bahwa MongoDB mencadangkan $ karakter untuk menentukan beberapa perintah atau agregasi pada catatan, seperti $group . Anda dapat mempelajari lebih lanjut tentang perilaku ini di dokumen resmi.

Anda dapat melakukan kueri seperti yang Anda lakukan di SQL. Untuk memulai, Anda dapat membuat indeks:

>>>
>>> customers.create_index([("name", pymongo.DESCENDING)])

Ini opsional, tetapi mempercepat kueri yang memerlukan pencarian nama.

Kemudian, Anda dapat mengambil nama pelanggan yang diurutkan dalam urutan menaik:

>>>
>>> items = customers.find().sort("name", pymongo.ASCENDING)

Anda juga dapat mengulangi dan mencetak item yang dibeli:

>>>
>>> for item in items:
...     print(item.get('boughtitems'))    
...
None
[{'title': 'Monitor', 'price': 199.99, 'original_item_id': 3, 'discounted': False}]
[{'title': 'USB', 'price': 10.2, 'currency': 'EUR', 'notes': 'Customer wants it delivered via FedEx', 'original_item_id': 1}]

Anda bahkan dapat mengambil daftar nama unik di database:

>>>
>>> customers.distinct("firstname")
['Bob', 'Amy', 'Rob']

Sekarang setelah Anda mengetahui nama pelanggan di database Anda, Anda dapat membuat kueri untuk mengambil informasi tentang mereka:

>>>
>>> for i in customers.find({"$or": [{'firstname':'Bob'}, {'firstname':'Amy'}]}, 
...                                  {'firstname':1, 'boughtitems':1, '_id':0}):
...     print(i)
...
{'firstname': 'Bob', 'boughtitems': [{'title': 'USB', 'price': 10.2, 'currency': 'EUR', 'notes': 'Customer wants it delivered via FedEx', 'original_item_id': 1}]}
{'firstname': 'Amy', 'boughtitems': [{'title': 'Monitor', 'price': 199.99, 'original_item_id': 3, 'discounted': False}]}

Inilah kueri SQL yang setara:

SELECT firstname, boughtitems FROM customers WHERE firstname LIKE ('Bob', 'Amy')

Perhatikan bahwa meskipun sintaksnya mungkin hanya sedikit berbeda, ada perbedaan drastis dalam cara kueri dijalankan di bawah tenda. Hal ini diharapkan karena struktur kueri yang berbeda dan kasus penggunaan antara database SQL dan NoSQL.



Q6:NoSQL vs SQL

Jika Anda memiliki skema yang terus berubah, seperti informasi peraturan keuangan, maka NoSQL dapat memodifikasi catatan dan informasi terkait sarang. Bayangkan jumlah gabungan yang harus Anda lakukan dalam SQL jika Anda memiliki delapan perintah bersarang! Namun, situasi ini lebih umum daripada yang Anda kira.

Sekarang, bagaimana jika Anda ingin menjalankan laporan, mengekstrak informasi tentang data keuangan itu, dan menyimpulkan kesimpulan? Dalam hal ini, Anda perlu menjalankan kueri kompleks, dan SQL cenderung lebih cepat dalam hal ini.

Catatan: Basis data SQL, khususnya PostgreSQL, juga telah merilis fitur yang memungkinkan data JSON yang dapat dikueri dimasukkan sebagai bagian dari catatan. Meskipun ini dapat menggabungkan yang terbaik dari kedua dunia, kecepatan mungkin menjadi perhatian.

Lebih cepat untuk menanyakan data tidak terstruktur dari database NoSQL daripada meminta bidang JSON dari kolom tipe JSON di PostgreSQL. Anda selalu dapat melakukan tes perbandingan kecepatan untuk mendapatkan jawaban yang pasti.

Meskipun demikian, fitur ini mungkin mengurangi kebutuhan akan database tambahan. Terkadang, objek yang diawetkan atau diserialisasi disimpan dalam catatan dalam bentuk tipe biner, dan kemudian dihilangkan serialnya saat dibaca.

Kecepatan bukan satu-satunya metrik. Anda juga ingin mempertimbangkan hal-hal seperti transaksi, atomisitas, daya tahan, dan skalabilitas. Transaksi penting dalam aplikasi keuangan, dan fitur tersebut diutamakan.

Karena ada berbagai macam basis data, masing-masing dengan fiturnya sendiri, adalah tugas insinyur data untuk membuat keputusan berdasarkan informasi tentang basis data yang akan digunakan di setiap aplikasi. Untuk informasi lebih lanjut, Anda dapat membaca properti ACID yang berkaitan dengan transaksi database.

Anda mungkin juga ditanya tentang database lain apa yang Anda ketahui dalam wawancara insinyur data Anda. Ada beberapa database relevan lainnya yang digunakan oleh banyak perusahaan:

  • Penelusuran Elastis sangat efisien dalam pencarian teks. Ini memanfaatkan database berbasis dokumen untuk membuat alat pencarian yang kuat.
  • DB Baru menggabungkan fitur ZODB dan PostgreSQL JSONB untuk membuat database NoSQL yang ramah Python.
  • InfluxDB digunakan dalam aplikasi deret waktu untuk menyimpan acara.

Daftarnya terus bertambah, tetapi ini menggambarkan bagaimana berbagai macam basis data yang tersedia semuanya memenuhi industri khusus mereka.




Pertanyaan tentang Database Cache

Database cache menyimpan data yang sering diakses. Mereka tinggal bersama database SQL dan NoSQL utama. Tujuan mereka adalah untuk mengurangi beban dan melayani permintaan lebih cepat.


Contoh Redis

Anda telah membahas database SQL dan NoSQL untuk solusi penyimpanan jangka panjang, tetapi bagaimana dengan penyimpanan yang lebih cepat dan lebih cepat? Bagaimana seorang insinyur data dapat mengubah seberapa cepat data diambil dari database?

Aplikasi web biasa mengambil data yang umum digunakan, seperti profil atau nama pengguna, sangat sering. Jika semua data terdapat dalam satu database, maka jumlah hit server database mendapat akan menjadi di atas dan tidak perlu. Oleh karena itu, diperlukan solusi penyimpanan yang lebih cepat dan lebih cepat.

Meskipun hal ini mengurangi beban server, hal ini juga menimbulkan dua masalah bagi insinyur data, tim backend, dan tim DevOps. Pertama, Anda sekarang memerlukan beberapa database yang memiliki waktu baca lebih cepat daripada database SQL atau NoSQL utama Anda. Namun, isi kedua database pada akhirnya harus cocok. (Selamat datang di masalah konsistensi negara antar database! Selamat menikmati.)

Sakit kepala kedua adalah bahwa DevOps sekarang perlu khawatir tentang skalabilitas, redundansi, dan sebagainya untuk database cache baru. Di bagian berikutnya, Anda akan mempelajari masalah seperti ini dengan bantuan Redis.



Q7:Cara Menggunakan Database Cache

Anda mungkin telah mendapatkan informasi yang cukup dari pendahuluan untuk menjawab pertanyaan ini! Database cache adalah solusi penyimpanan cepat yang digunakan untuk menyimpan data yang berumur pendek, terstruktur, atau tidak terstruktur. Itu dapat dipartisi dan diskalakan sesuai dengan kebutuhan Anda, tetapi biasanya ukurannya jauh lebih kecil daripada basis data utama Anda. Karena itu, basis data cache Anda dapat berada di memori, memungkinkan Anda mengabaikan kebutuhan untuk membaca dari disk.

Catatan: Jika Anda pernah menggunakan kamus dengan Python, maka Redis mengikuti struktur yang sama. Ini adalah penyimpanan nilai kunci, tempat Anda dapat SET dan GET data seperti dict Python Python .

Saat ada permintaan masuk, Anda terlebih dahulu memeriksa database cache, lalu database utama. Dengan cara ini, Anda dapat mencegah permintaan yang tidak perlu dan berulang untuk mencapai server database utama. Karena basis data cache memiliki waktu baca yang lebih rendah, Anda juga mendapat manfaat dari peningkatan kinerja!

Anda dapat menggunakan pip untuk menginstal perpustakaan yang diperlukan:

$ pip install redis

Sekarang, pertimbangkan permintaan untuk mendapatkan nama pengguna dari ID mereka:

import redis
from datetime import timedelta

# In a real web application, configuration is obtained from settings or utils
r = redis.Redis()

# Assume this is a getter handling a request
def get_name(request, *args, **kwargs):
    id = request.get('id')
    if id in r:
        return r.get(id)  # Assume that we have an {id: name} store
    else:
        # Get data from the main DB here, assume we already did it
        name = 'Bob'
        # Set the value in the cache database, with an expiration time
        r.setex(id, timedelta(minutes=60), value=name)
        return name

Kode ini memeriksa apakah namanya ada di Redis menggunakan id kunci. Jika tidak, maka nama tersebut disetel dengan waktu kedaluwarsa, yang Anda gunakan karena cache berumur pendek.

Sekarang, bagaimana jika pewawancara Anda bertanya apa yang salah dengan kode ini? Tanggapan Anda seharusnya tidak ada penanganan pengecualian! Basis data dapat memiliki banyak masalah, seperti koneksi terputus, jadi sebaiknya Anda mencoba dan menangkap pengecualian tersebut.




Pertanyaan tentang Pola Desain dan Konsep ETL

Dalam aplikasi besar, Anda akan sering menggunakan lebih dari satu jenis database. Faktanya, PostgreSQL, MongoDB, dan Redis dapat digunakan hanya dalam satu aplikasi! Satu masalah yang menantang adalah berurusan dengan perubahan status antar database, yang memaparkan pengembang pada masalah konsistensi. Pertimbangkan skenario berikut:

  1. Nilai di Database #1 diperbarui.
  2. Nilai yang sama di Database #2 tetap sama (tidak diperbarui).
  3. Kueri dijalankan di Database #2.

Sekarang, Anda mendapatkan hasil yang tidak konsisten dan ketinggalan zaman! Hasil yang dikembalikan dari database kedua tidak akan mencerminkan nilai yang diperbarui di database pertama. Hal ini dapat terjadi dengan dua database mana pun, tetapi ini sangat umum terjadi ketika database utama adalah database NoSQL, dan informasi diubah menjadi SQL untuk tujuan kueri.

Database mungkin memiliki pekerja latar belakang untuk mengatasi masalah seperti itu. Pekerja ini ekstrak data dari satu database, transformasi dalam beberapa cara, dan memuat ke dalam database target. Saat Anda mengonversi dari database NoSQL ke database SQL, proses Extract, transform, load (ETL) mengambil langkah-langkah berikut:

  1. Ekstrak: Ada pemicu MongoDB setiap kali catatan dibuat, diperbarui, dan sebagainya. Fungsi panggilan balik dipanggil secara asinkron pada utas terpisah.
  2. Transformasi: Bagian dari catatan diekstraksi, dinormalisasi, dan dimasukkan ke dalam struktur data (atau baris) yang benar untuk dimasukkan ke dalam SQL.
  3. Muat: Basis data SQL diperbarui dalam kumpulan, atau sebagai catatan tunggal untuk penulisan volume tinggi.

Alur kerja ini cukup umum di aplikasi keuangan, game, dan pelaporan. Dalam kasus ini, skema yang terus berubah memerlukan database NoSQL, tetapi pelaporan, analisis, dan agregasi memerlukan database SQL.


Q8:Tantangan ETL

Ada beberapa konsep yang menantang dalam ETL, antara lain sebagai berikut:

  • Data besar
  • Masalah stateful
  • Pekerja asinkron
  • Pencocokan jenis

Daftarnya terus berlanjut! Namun, karena langkah-langkah dalam proses ETL didefinisikan dengan baik dan logis, para insinyur data dan backend biasanya akan lebih mengkhawatirkan kinerja dan ketersediaan daripada implementasi.

Jika aplikasi Anda menulis ribuan catatan per detik ke MongoDB, maka pekerja ETL Anda perlu mengikuti transformasi, pemuatan, dan pengiriman data ke pengguna dalam formulir yang diminta. Kecepatan dan latensi dapat menjadi masalah, sehingga pekerja ini biasanya ditulis dalam bahasa cepat. Anda dapat menggunakan kode yang dikompilasi untuk langkah transformasi untuk mempercepat, karena bagian ini biasanya terikat pada CPU.

Catatan: Multi-pemrosesan dan pemisahan pekerja adalah solusi lain yang mungkin ingin Anda pertimbangkan.

Jika Anda berurusan dengan banyak fungsi CPU-intensif, maka Anda mungkin ingin memeriksa Numba. Pustaka ini mengkompilasi fungsi untuk membuatnya lebih cepat dalam eksekusi. Yang terbaik dari semuanya, ini mudah diimplementasikan dengan Python, meskipun ada beberapa batasan pada fungsi apa yang dapat digunakan dalam fungsi yang dikompilasi ini.



Q9:Pola Desain dalam Big Data

Bayangkan Amazon perlu membuat sistem rekomendasi untuk menyarankan produk yang sesuai kepada pengguna. Tim ilmu data membutuhkan data dan banyak lagi! Mereka mendatangi Anda, insinyur data, dan meminta Anda untuk membuat gudang basis data pementasan terpisah. Di situlah mereka akan membersihkan dan mengubah data.

Anda mungkin terkejut menerima permintaan seperti itu. Jika Anda memiliki terabyte data, Anda memerlukan banyak mesin untuk menangani semua informasi itu. Sebuah fungsi agregasi database bisa menjadi operasi yang sangat kompleks. Bagaimana cara Anda membuat kueri, menggabungkan, dan menggunakan data yang relatif besar dengan cara yang efisien?

Apache awalnya memperkenalkan MapReduce, yang mengikuti map, shuffle, reduce alur kerja. Idenya adalah untuk memetakan data yang berbeda pada mesin yang terpisah, juga disebut cluster. Kemudian, Anda dapat melakukan pekerjaan pada data, yang dikelompokkan berdasarkan kunci, dan terakhir, menggabungkan data di tahap akhir.

Alur kerja ini masih digunakan sampai sekarang, tetapi baru-baru ini memudar demi Spark. Pola desain, bagaimanapun, membentuk dasar dari sebagian besar alur kerja data besar dan merupakan konsep yang sangat menarik. Anda dapat membaca lebih lanjut tentang MapReduce di IBM Analytics.



Q10:Aspek Umum Proses ETL dan Alur Kerja Big Data

Anda mungkin menganggap ini pertanyaan yang agak aneh, tetapi ini hanyalah pemeriksaan pengetahuan ilmu komputer Anda, serta pengetahuan dan pengalaman desain Anda secara keseluruhan.

Kedua alur kerja mengikuti Produsen-Konsumen pola. Seorang pekerja (Produser) menghasilkan beberapa jenis data dan mengeluarkannya ke saluran pipa. Pipa ini dapat mengambil banyak bentuk, termasuk pesan jaringan dan pemicu. Setelah Produsen mengeluarkan data, Konsumen mengkonsumsi dan memanfaatkannya. Pekerja ini biasanya bekerja secara asinkron dan dieksekusi dalam proses terpisah.

Anda dapat menyamakan Producer dengan langkah-langkah ekstrak dan transformasi dari proses ETL. Demikian pula, dalam data besar, mapper dapat dilihat sebagai Produser, sedangkan pereduksi secara efektif adalah Konsumen. Pemisahan masalah ini sangat penting dan efektif dalam pengembangan dan desain arsitektur aplikasi.




Kesimpulan

Selamat! Anda telah membahas banyak hal dan menjawab beberapa pertanyaan wawancara insinyur data. Anda sekarang memahami lebih banyak tentang banyak topi berbeda yang dapat dikenakan oleh seorang insinyur data, serta apa tanggung jawab Anda sehubungan dengan database, desain, dan alur kerja.

Berbekal pengetahuan ini, Anda sekarang dapat:

  • Gunakan Python dengan SQL, NoSQL, dan database cache
  • Gunakan Python di ETL dan aplikasi kueri
  • Rencanakan proyek sebelumnya, mempertimbangkan desain dan alur kerja

Meskipun pertanyaan wawancara dapat bervariasi, Anda telah dihadapkan pada banyak topik dan belajar untuk berpikir di luar kebiasaan di berbagai bidang ilmu komputer. Sekarang Anda siap untuk melakukan wawancara yang luar biasa!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memfilter Rekaman dengan Fungsi Agregat AVG

  2. Berapa Banyak RAM yang Dibutuhkan Server Database Baru Anda?

  3. Cara Menghilangkan Baris Duplikat di SQL

  4. Cara Menginstal dan Mengonfigurasi Zabbix di Ubuntu 20.04

  5. Mengukur kinerja database di bawah tekanan