Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Câu hỏi phỏng vấn kỹ sư dữ liệu với Python

Đi phỏng vấn có thể là một quá trình tốn thời gian và mệt mỏi, và các cuộc phỏng vấn kỹ thuật thậm chí có thể căng thẳng hơn! Hướng dẫn này nhằm chuẩn bị cho bạn một số câu hỏi phổ biến mà bạn sẽ gặp phải trong cuộc phỏng vấn kỹ sư dữ liệu của mình. Bạn sẽ học cách trả lời các câu hỏi về cơ sở dữ liệu, Python và SQL.

Đến cuối hướng dẫn này, bạn sẽ có thể:

  • Hiểu các câu hỏi phỏng vấn kỹ sư dữ liệu phổ biến
  • Phân biệt giữa cơ sở dữ liệu quan hệ và không quan hệ
  • Thiết lập cơ sở dữ liệu bằng Python
  • Sử dụng Python để truy vấn dữ liệu

Tải xuống miễn phí: Nhận một chương mẫu từ Thủ thuật Python:Cuốn sách chỉ cho bạn các phương pháp hay nhất của Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã + Pythonic đẹp hơn.


Trở thành Kỹ sư dữ liệu

Vai trò kỹ thuật dữ liệu có thể là một vai trò rộng lớn và đa dạng. Bạn sẽ cần phải có kiến ​​thức làm việc về nhiều công nghệ và khái niệm. Kỹ sư dữ liệu linh hoạt trong suy nghĩ của họ. Nhờ đó, họ có thể thành thạo nhiều chủ đề, chẳng hạn như cơ sở dữ liệu, phát triển phần mềm, DevOps và dữ liệu lớn.


Kỹ sư dữ liệu làm gì?

Với bộ kỹ năng đa dạng, vai trò kỹ thuật dữ liệu có thể bao gồm nhiều mô tả công việc khác nhau. Một kỹ sư dữ liệu có thể chịu trách nhiệm thiết kế cơ sở dữ liệu, thiết kế lược đồ và tạo nhiều giải pháp cơ sở dữ liệu. Công việc này cũng có thể liên quan đến Quản trị viên cơ sở dữ liệu.

Là một kỹ sư dữ liệu , bạn có thể đóng vai trò là cầu nối giữa cơ sở dữ liệu và các nhóm khoa học dữ liệu. Trong trường hợp đó, bạn cũng sẽ chịu trách nhiệm làm sạch và chuẩn bị dữ liệu. Nếu có liên quan đến dữ liệu lớn, thì nhiệm vụ của bạn là đưa ra giải pháp hiệu quả cho dữ liệu đó. Công việc này có thể trùng lặp với vai trò DevOps.

Bạn cũng sẽ cần thực hiện các truy vấn dữ liệu hiệu quả để báo cáo và phân tích. Bạn có thể cần phải tương tác với nhiều cơ sở dữ liệu hoặc viết Thủ tục lưu trữ. Đối với nhiều giải pháp như các trang web hoặc dịch vụ có lưu lượng truy cập cao, có thể có nhiều hơn một cơ sở dữ liệu. Trong những trường hợp này, kỹ sư dữ liệu chịu trách nhiệm thiết lập cơ sở dữ liệu, duy trì chúng và chuyển dữ liệu giữa chúng.



Python có thể giúp các kỹ sư dữ liệu như thế nào?

Python được biết đến là con dao quân đội Thụy Sĩ của các ngôn ngữ lập trình. Nó đặc biệt hữu ích trong khoa học dữ liệu, hệ thống phụ trợ và tập lệnh phía máy chủ. Đó là bởi vì Python có khả năng gõ mạnh, cú pháp đơn giản và vô số thư viện của bên thứ ba để sử dụng. Pandas, SciPy, Tensorflow, SQLAlchemy và NumPy là một số thư viện được sử dụng rộng rãi nhất trong sản xuất ở các ngành khác nhau.

Quan trọng nhất, Python giảm thời gian phát triển, có nghĩa là ít chi phí hơn cho các công ty. Đối với một kỹ sư dữ liệu, hầu hết việc thực thi mã là ràng buộc cơ sở dữ liệu, không ràng buộc CPU. Do đó, việc tận dụng sự đơn giản của Python, ngay cả với cái giá phải trả là hiệu suất chậm hơn khi so sánh với các ngôn ngữ đã biên dịch như C # và Java.




Trả lời câu hỏi phỏng vấn kỹ sư dữ liệu

Bây giờ bạn đã biết vai trò của mình có thể bao gồm những gì, đã đến lúc tìm hiểu cách trả lời một số câu hỏi phỏng vấn kỹ sư dữ liệu! Mặc dù có rất nhiều điều cần giải quyết, nhưng bạn sẽ thấy các ví dụ Python thực tế trong suốt hướng dẫn để hướng dẫn bạn trong quá trình thực hiện.



Câu hỏi về Cơ sở dữ liệu quan hệ

Cơ sở dữ liệu là một trong những thành phần quan trọng nhất trong hệ thống. Không có chúng, không thể có nhà nước và không có lịch sử. Mặc dù bạn có thể không coi thiết kế cơ sở dữ liệu là ưu tiên, nhưng hãy biết rằng nó có thể có tác động đáng kể đến tốc độ tải trang của bạn. Trong vài năm qua, một số tập đoàn lớn đã giới thiệu một số công cụ và kỹ thuật mới:

  • NoSQL
  • Cơ sở dữ liệu bộ nhớ cache
  • Cơ sở dữ liệu đồ thị
  • Hỗ trợ NoSQL trong cơ sở dữ liệu SQL

Những kỹ thuật này và các kỹ thuật khác đã được phát minh để thử và tăng tốc độ xử lý các yêu cầu của cơ sở dữ liệu. Có thể bạn sẽ cần nói về những khái niệm này trong cuộc phỏng vấn với kỹ sư dữ liệu của mình, vì vậy hãy cùng xem qua một số câu hỏi!


Q1:Cơ sở dữ liệu quan hệ so với phi quan hệ

Một cơ sở dữ liệu quan hệ là một nơi dữ liệu được lưu trữ dưới dạng bảng. Mỗi bảng có một giản đồ , là các cột và loại bản ghi bắt buộc phải có. Mỗi lược đồ phải có ít nhất một khóa chính xác định duy nhất bản ghi đó. Nói cách khác, không có hàng trùng lặp nào trong cơ sở dữ liệu của bạn. Hơn nữa, mỗi bảng có thể liên quan đến các bảng khác bằng cách sử dụng khóa ngoại.

Một khía cạnh quan trọng của cơ sở dữ liệu quan hệ là sự thay đổi trong lược đồ phải được áp dụng cho tất cả các bản ghi. Điều này đôi khi có thể gây ra gãy và đau đầu lớn trong quá trình di chuyển. Cơ sở dữ liệu không quan hệ giải quyết mọi thứ theo một cách khác. Chúng vốn dĩ không có lược đồ, có nghĩa là các bản ghi có thể được lưu bằng các lược đồ khác nhau và với một cấu trúc lồng nhau, khác nhau. Các bản ghi vẫn có thể có khóa chính, nhưng sự thay đổi trong lược đồ được thực hiện trên cơ sở từng mục nhập.

Bạn sẽ cần thực hiện kiểm tra so sánh tốc độ dựa trên loại chức năng đang được thực hiện. Bạn có thể chọn INSERT , UPDATE , DELETE , hoặc một chức năng khác. Thiết kế lược đồ, chỉ số, số lượng tổng hợp và số lượng bản ghi cũng sẽ ảnh hưởng đến phân tích này, vì vậy bạn sẽ cần phải kiểm tra kỹ lưỡng. Bạn sẽ tìm hiểu thêm về cách thực hiện việc này sau.

Cơ sở dữ liệu cũng khác nhau về khả năng mở rộng . Cơ sở dữ liệu phi quan hệ có thể bớt đau đầu hơn khi phân phối. Đó là bởi vì một bộ sưu tập các bản ghi liên quan có thể dễ dàng được lưu trữ trên một nút cụ thể. Mặt khác, cơ sở dữ liệu quan hệ đòi hỏi nhiều suy nghĩ hơn và thường sử dụng hệ thống chủ-tớ.



Một ví dụ về SQLite

Bây giờ bạn đã trả lời cơ sở dữ liệu quan hệ là gì, đã đến lúc tìm hiểu về một số Python! SQLite là một cơ sở dữ liệu thuận tiện mà bạn có thể sử dụng trên máy cục bộ của mình. Cơ sở dữ liệu là một tệp duy nhất, lý tưởng cho mục đích tạo mẫu. Đầu tiên, nhập thư viện Python được yêu cầu và tạo cơ sở dữ liệu mới:

import sqlite3

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

Giờ đây, bạn đã được kết nối với cơ sở dữ liệu trong bộ nhớ và sẵn sàng sử dụng đối tượng con trỏ.

Tiếp theo, bạn sẽ tạo ba bảng sau:

  1. Khách hàng: Bảng này sẽ chứa khóa chính cũng như họ và tên của khách hàng.
  2. Mục: Bảng này sẽ chứa khóa chính, tên mặt hàng và giá mặt hàng.
  3. Các mặt hàng đã mua :Bảng này sẽ chứa số thứ tự, ngày tháng và giá cả. Nó cũng sẽ kết nối với các khóa chính trong các bảng Mặt hàng và Khách hàng.

Bây giờ bạn đã có ý tưởng về các bảng của mình sẽ trông như thế nào, bạn có thể tiếp tục và tạo chúng:

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) )''')

Bạn đã chuyển một truy vấn tới cur.execute() để tạo ba bảng của bạn.

Bước cuối cùng là điền dữ liệu vào bảng của bạn:

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 

Bây giờ có một vài bản ghi trong mỗi bảng, bạn có thể sử dụng dữ liệu này để trả lời thêm một số câu hỏi phỏng vấn kỹ sư dữ liệu.



Câu hỏi 2:Hàm tổng hợp SQL

Hàm tổng hợp là những phép toán thực hiện một phép toán trên một tập kết quả. Một số ví dụ bao gồm AVG , COUNT , MIN , MAXSUM . Thông thường, bạn sẽ cần GROUP BYHAVING mệnh đề bổ sung cho các tập hợp này. Một hàm tổng hợp hữu ích là AVG , mà bạn có thể sử dụng để tính giá trị trung bình của một tập kết quả nhất định:

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

Tại đây, bạn đã truy xuất giá trung bình cho từng mặt hàng đã mua trong cơ sở dữ liệu của mình. Bạn có thể thấy rằng mặt hàng có itemid trong tổng số 1 có giá trung bình là $ 10,20.

Để làm cho đầu ra ở trên dễ hiểu hơn, bạn có thể hiển thị tên mục thay vì 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)]

Bây giờ, bạn dễ dàng nhận thấy mặt hàng có giá trung bình $ 10,20 là USB .

Một tổng hợp hữu ích khác là SUM . Bạn có thể sử dụng chức năng này để hiển thị tổng số tiền mà mỗi khách hàng đã chi tiêu:

>>>
>>> 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)]

Trung bình, khách hàng tên Amy đã chi khoảng 180 đô la, trong khi Rob chỉ chi 11,23 đô la!

Nếu người phỏng vấn của bạn thích cơ sở dữ liệu, thì bạn có thể muốn xem xét các truy vấn lồng nhau, các loại kết hợp và các bước mà cơ sở dữ liệu quan hệ thực hiện để thực hiện truy vấn của bạn.



Q3:Tăng tốc truy vấn SQL

Tốc độ phụ thuộc vào các yếu tố khác nhau, nhưng chủ yếu bị ảnh hưởng bởi số lượng của từng yếu tố sau:

  • Tham gia
  • Tổng hợp
  • Giao dịch
  • Bản ghi

Số lượng liên kết càng lớn, độ phức tạp càng cao và số lượng truyền tải trong bảng càng lớn. Nhiều phép nối khá tốn kém để thực hiện trên vài nghìn bản ghi liên quan đến một số bảng vì cơ sở dữ liệu cũng cần lưu vào bộ đệm kết quả trung gian! Tại thời điểm này, bạn có thể bắt đầu nghĩ về cách tăng kích thước bộ nhớ của mình.

Tốc độ cũng bị ảnh hưởng bởi việc có hay không có chỉ số hiện trong cơ sở dữ liệu. Các chỉ số cực kỳ quan trọng và cho phép bạn nhanh chóng tìm kiếm trong bảng và tìm kết quả khớp cho một số cột được chỉ định trong truy vấn.

Các chỉ số sắp xếp các bản ghi với chi phí thời gian chèn cao hơn, cũng như một số bộ nhớ. Nhiều cột có thể được kết hợp để tạo một chỉ mục duy nhất. Ví dụ:các cột dateprice có thể được kết hợp vì truy vấn của bạn phụ thuộc vào cả hai điều kiện.



Q4:Gỡ lỗi truy vấn SQL

Hầu hết các cơ sở dữ liệu đều có EXPLAIN QUERY PLAN mô tả các bước cơ sở dữ liệu thực hiện để thực thi truy vấn. Đối với SQLite, bạn có thể bật chức năng này bằng cách thêm EXPLAIN QUERY PLAN phía trước SELECT tuyên bố:

>>>
>>> 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=?)')]

Truy vấn này cố gắng liệt kê tên, tiêu đề mặt hàng, giá gốc và giá đã mua cho tất cả các mặt hàng đã mua.

Đây là bản thân kế hoạch truy vấn trông như thế nào:

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=?)

Lưu ý rằng câu lệnh tìm nạp trong mã Python của bạn chỉ trả về giải thích chứ không trả về kết quả. Đó là bởi vì EXPLAIN QUERY PLAN không nhằm mục đích sử dụng trong sản xuất.




Câu hỏi về Cơ sở dữ liệu Không quan hệ

Trong phần trước, bạn đã trình bày sự khác biệt giữa cơ sở dữ liệu quan hệ và không quan hệ cũng như sử dụng SQLite với Python. Bây giờ bạn sẽ tập trung vào NoSQL. Mục tiêu của bạn là làm nổi bật điểm mạnh, điểm khác biệt và trường hợp sử dụng của nó.


Một ví dụ về MongoDB

Bạn sẽ sử dụng cùng một dữ liệu như trước đây, nhưng lần này cơ sở dữ liệu của bạn sẽ là MongoDB. Cơ sở dữ liệu NoSQL này dựa trên tài liệu và quy mô rất tốt. Điều đầu tiên, bạn cần cài đặt thư viện Python cần thiết:

$ pip install pymongo

Bạn cũng có thể muốn cài đặt Cộng đồng La bàn MongoDB. Nó bao gồm một IDE cục bộ hoàn hảo để hiển thị cơ sở dữ liệu. Với nó, bạn có thể xem các bản ghi đã tạo, tạo trình kích hoạt và hoạt động như quản trị viên trực quan cho cơ sở dữ liệu.

Lưu ý: Để chạy mã trong phần này, bạn sẽ cần một máy chủ cơ sở dữ liệu đang chạy. Để tìm hiểu thêm về cách thiết lập, hãy xem Giới thiệu về MongoDB và Python.

Đây là cách bạn tạo cơ sở dữ liệu và chèn một số dữ liệu:

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)

Như bạn có thể nhận thấy, MongoDB lưu trữ các bản ghi dữ liệu trong bộ sưu tập , tương đương với danh sách các từ điển bằng Python. Trên thực tế, MongoDB lưu trữ các tài liệu BSON.



Q5:Truy vấn dữ liệu với MongoDB

Hãy thử tái tạo BoughtItem đầu tiên, như bạn đã làm trong SQL. Để làm điều này, bạn phải thêm một trường mới cho một khách hàng. Tài liệu của MongoDB chỉ định rằng toán tử từ khóa set có thể được sử dụng để cập nhật một bản ghi mà không cần phải ghi tất cả các trường hiện có:

# 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
                    }
                ]
            },
        }
    )

Lưu ý cách bạn đã thêm các trường bổ sung vào customer mà không cần xác định trước lược đồ một cách rõ ràng. Nifty!

Trên thực tế, bạn có thể cập nhật một khách hàng khác bằng một giản đồ đã được thay đổi một chút:

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

Tương tự như SQL, cơ sở dữ liệu dựa trên tài liệu cũng cho phép thực thi các truy vấn và tổng hợp. Tuy nhiên, chức năng có thể khác nhau cả về cú pháp và cách thực thi cơ bản. Trên thực tế, bạn có thể nhận thấy rằng MongoDB bảo lưu $ để chỉ định một số lệnh hoặc tập hợp trên các bản ghi, chẳng hạn như $group . Bạn có thể tìm hiểu thêm về hành vi này trong tài liệu chính thức.

Bạn có thể thực hiện các truy vấn giống như bạn đã làm trong SQL. Để bắt đầu, bạn có thể tạo một chỉ mục:

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

Đây là tùy chọn, nhưng nó tăng tốc các truy vấn yêu cầu tra cứu tên.

Sau đó, bạn có thể truy xuất tên khách hàng được sắp xếp theo thứ tự tăng dần:

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

Bạn cũng có thể lặp lại và in các mặt hàng đã mua:

>>>
>>> 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}]

Bạn thậm chí có thể truy xuất danh sách các tên duy nhất trong cơ sở dữ liệu:

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

Giờ bạn đã biết tên của khách hàng trong cơ sở dữ liệu của mình, bạn có thể tạo truy vấn để lấy thông tin về họ:

>>>
>>> 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}]}

Đây là truy vấn SQL tương đương:

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

Lưu ý rằng mặc dù cú pháp có thể chỉ khác nhau một chút, nhưng có sự khác biệt lớn về cách các truy vấn được thực thi bên dưới lớp phủ. Điều này được mong đợi vì cấu trúc truy vấn và trường hợp sử dụng khác nhau giữa cơ sở dữ liệu SQL và NoSQL.



Q6:NoSQL và SQL

Nếu bạn có một lược đồ liên tục thay đổi, chẳng hạn như thông tin quy định tài chính, thì NoSQL có thể sửa đổi các bản ghi và lồng thông tin liên quan. Hãy tưởng tượng số lượng phép nối bạn phải thực hiện trong SQL nếu bạn có tám thứ tự lồng nhau! Tuy nhiên, tình huống này phổ biến hơn bạn nghĩ.

Bây giờ, nếu bạn muốn chạy báo cáo, trích xuất thông tin trên dữ liệu tài chính đó và đưa ra kết luận thì sao? Trong trường hợp này, bạn cần chạy các truy vấn phức tạp và SQL có xu hướng nhanh hơn về mặt này.

Lưu ý: Cơ sở dữ liệu SQL, đặc biệt là PostgreSQL, cũng đã phát hành một tính năng cho phép chèn dữ liệu JSON có thể truy vấn như một phần của bản ghi. Trong khi điều này có thể kết hợp tốt nhất của cả hai thế giới, tốc độ có thể là mối quan tâm.

Truy vấn dữ liệu phi cấu trúc từ cơ sở dữ liệu NoSQL nhanh hơn so với truy vấn các trường JSON từ cột kiểu JSON trong PostgreSQL. Bạn luôn có thể thực hiện kiểm tra so sánh tốc độ để có câu trả lời chính xác.

Tuy nhiên, tính năng này có thể làm giảm nhu cầu về cơ sở dữ liệu bổ sung. Đôi khi, các đối tượng được chọn lọc hoặc được tuần tự hóa được lưu trữ trong các bản ghi ở dạng các loại nhị phân, và sau đó được hủy tuần tự hóa khi đọc.

Tuy nhiên, tốc độ không phải là chỉ số duy nhất. Bạn cũng sẽ muốn tính đến những thứ như giao dịch, tính nguyên tử, độ bền và khả năng mở rộng. Giao dịch rất quan trọng trong các ứng dụng tài chính và các tính năng như vậy được ưu tiên hơn.

Vì có nhiều loại cơ sở dữ liệu, mỗi cơ sở dữ liệu có các tính năng riêng, nhiệm vụ của kỹ sư dữ liệu là đưa ra quyết định sáng suốt về việc sử dụng cơ sở dữ liệu nào trong mỗi ứng dụng. Để biết thêm thông tin, bạn có thể đọc các thuộc tính ACID liên quan đến các giao dịch cơ sở dữ liệu.

Bạn cũng có thể được hỏi về những cơ sở dữ liệu nào khác mà bạn biết trong cuộc phỏng vấn kỹ sư dữ liệu của mình. Có một số cơ sở dữ liệu có liên quan khác được nhiều công ty sử dụng:

  • Tìm kiếm đàn hồi có hiệu quả cao trong tìm kiếm văn bản. Nó tận dụng cơ sở dữ liệu dựa trên tài liệu của mình để tạo ra một công cụ tìm kiếm mạnh mẽ.
  • Newt DB kết hợp ZODB và tính năng PostgreSQL JSONB để tạo cơ sở dữ liệu NoSQL thân thiện với Python.
  • InfluxDB được sử dụng trong các ứng dụng chuỗi thời gian để lưu trữ các sự kiện.

Danh sách vẫn tiếp tục, nhưng điều này minh họa cách nhiều loại cơ sở dữ liệu có sẵn đều phục vụ cho ngành công nghiệp thích hợp của họ.




Câu hỏi về Cơ sở dữ liệu bộ nhớ cache

Cơ sở dữ liệu bộ nhớ đệm giữ dữ liệu được truy cập thường xuyên. Chúng sống cùng với cơ sở dữ liệu SQL và NoSQL chính. Mục đích của họ là giảm tải và phục vụ các yêu cầu nhanh hơn.


Một ví dụ về Redis

Bạn đã đề cập đến cơ sở dữ liệu SQL và NoSQL cho các giải pháp lưu trữ lâu dài, nhưng lưu trữ nhanh hơn, tức thì hơn thì sao? Làm cách nào một kỹ sư dữ liệu có thể thay đổi tốc độ truy xuất dữ liệu từ cơ sở dữ liệu?

Các ứng dụng web điển hình truy xuất dữ liệu thường được sử dụng, chẳng hạn như hồ sơ hoặc tên của người dùng, rất thường xuyên. Nếu tất cả dữ liệu được chứa trong một cơ sở dữ liệu thì số lần truy cập máy chủ cơ sở dữ liệu nhận được sẽ ở trên cùng và không cần thiết. Do đó, cần có giải pháp lưu trữ nhanh hơn, tức thì hơn.

Mặc dù điều này làm giảm tải máy chủ, nhưng nó cũng tạo ra hai vấn đề đau đầu cho kỹ sư dữ liệu, nhóm phụ trợ và nhóm DevOps. Trước tiên, bây giờ bạn sẽ cần một số cơ sở dữ liệu có thời gian đọc nhanh hơn cơ sở dữ liệu SQL hoặc NoSQL chính của bạn. Tuy nhiên, nội dung của cả hai cơ sở dữ liệu cuối cùng phải khớp với nhau. (Chào mừng bạn đến với vấn đề về tính nhất quán của trạng thái giữa các cơ sở dữ liệu! Hãy tận hưởng.)

Vấn đề đau đầu thứ hai là DevOps bây giờ cần phải lo lắng về khả năng mở rộng, khả năng dự phòng, v.v. cho cơ sở dữ liệu bộ nhớ cache mới. Trong phần tiếp theo, bạn sẽ đi sâu vào các vấn đề như thế này với sự trợ giúp của Redis.



Q7:Cách sử dụng cơ sở dữ liệu bộ nhớ cache

Bạn có thể đã có đủ thông tin từ phần giới thiệu để trả lời câu hỏi này! Một cơ sở dữ liệu bộ nhớ cache là một giải pháp lưu trữ nhanh được sử dụng để lưu trữ dữ liệu tồn tại trong thời gian ngắn, có cấu trúc hoặc không có cấu trúc. Nó có thể được phân vùng và chia tỷ lệ theo nhu cầu của bạn, nhưng nó thường có kích thước nhỏ hơn nhiều so với cơ sở dữ liệu chính của bạn. Do đó, cơ sở dữ liệu bộ nhớ cache của bạn có thể nằm trong bộ nhớ, cho phép bạn bỏ qua nhu cầu đọc từ đĩa.

Lưu ý: Nếu bạn đã từng sử dụng từ điển bằng Python, thì Redis cũng tuân theo cấu trúc tương tự. Đó là một cửa hàng khóa-giá trị, nơi bạn có thể SETGET dữ liệu giống như một dict trong Python .

Khi một yêu cầu đến, trước tiên bạn kiểm tra cơ sở dữ liệu bộ đệm, sau đó là cơ sở dữ liệu chính. Bằng cách này, bạn có thể ngăn mọi yêu cầu lặp lại và không cần thiết đến máy chủ của cơ sở dữ liệu chính. Vì cơ sở dữ liệu bộ nhớ cache có thời gian đọc thấp hơn, bạn cũng được hưởng lợi từ việc tăng hiệu suất!

Bạn có thể sử dụng pip để cài đặt thư viện cần thiết:

$ pip install redis

Bây giờ, hãy xem xét yêu cầu lấy tên người dùng từ ID của họ:

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

Mã này kiểm tra xem tên có trong Redis hay không bằng cách sử dụng id Chìa khóa. Nếu không, thì tên được đặt với thời gian hết hạn mà bạn sử dụng vì bộ nhớ cache tồn tại trong thời gian ngắn.

Bây giờ, điều gì sẽ xảy ra nếu người phỏng vấn của bạn hỏi bạn có vấn đề gì với mã này? Câu trả lời của bạn phải là không có cách xử lý ngoại lệ nào! Cơ sở dữ liệu có thể gặp nhiều vấn đề, chẳng hạn như kết nối bị ngắt, vì vậy, bạn nên thử và bắt những trường hợp ngoại lệ đó.




Câu hỏi về Mẫu thiết kế và Khái niệm ETL

Trong các ứng dụng lớn, bạn sẽ thường sử dụng nhiều loại cơ sở dữ liệu. Trên thực tế, có thể sử dụng tất cả PostgreSQL, MongoDB và Redis chỉ trong một ứng dụng! Một vấn đề khó khăn là xử lý các thay đổi trạng thái giữa các cơ sở dữ liệu, điều này khiến nhà phát triển gặp phải các vấn đề về tính nhất quán. Hãy xem xét tình huống sau:

  1. Một giá trị trong Cơ sở dữ liệu số 1 đã được cập nhật.
  2. Giá trị tương tự trong Cơ sở dữ liệu số 2 được giữ nguyên (không cập nhật).
  3. Một truy vấn được chạy trên Cơ sở dữ liệu # 2.

Bây giờ, bạn đã nhận cho mình một kết quả không nhất quán và lỗi thời! Kết quả trả về từ cơ sở dữ liệu thứ hai sẽ không phản ánh giá trị được cập nhật trong cơ sở dữ liệu đầu tiên. Điều này có thể xảy ra với bất kỳ hai cơ sở dữ liệu nào, nhưng nó đặc biệt phổ biến khi cơ sở dữ liệu chính là cơ sở dữ liệu NoSQL và thông tin được chuyển đổi thành SQL cho mục đích truy vấn.

Cơ sở dữ liệu có thể có nhân viên nền tảng để giải quyết các vấn đề như vậy. Những nhân viên này trích xuất dữ liệu từ một cơ sở dữ liệu, chuyển đổi nó theo một cách nào đó và tải nó vào cơ sở dữ liệu đích. Khi bạn đang chuyển đổi từ cơ sở dữ liệu NoSQL sang cơ sở dữ liệu SQL, quá trình Trích xuất, chuyển đổi, tải (ETL) sẽ thực hiện theo các bước sau:

  1. Trích xuất: Có một trình kích hoạt MongoDB bất cứ khi nào bản ghi được tạo, cập nhật, v.v. Một hàm gọi lại được gọi không đồng bộ trên một chuỗi riêng biệt.
  2. Chuyển đổi: Các phần của bản ghi được trích xuất, chuẩn hóa và đưa vào cấu trúc dữ liệu chính xác (hoặc hàng) để chèn vào SQL.
  3. Tải: Cơ sở dữ liệu SQL được cập nhật theo lô hoặc dưới dạng một bản ghi để ghi khối lượng lớn.

Quy trình làm việc này khá phổ biến trong các ứng dụng tài chính, chơi game và báo cáo. Trong những trường hợp này, lược đồ thay đổi liên tục yêu cầu cơ sở dữ liệu NoSQL, nhưng báo cáo, phân tích và tổng hợp yêu cầu cơ sở dữ liệu SQL.


Q8:Thử thách ETL

Có một số khái niệm thách thức trong ETL, bao gồm những điều sau:

  • Dữ liệu lớn
  • Sự cố rõ ràng
  • Công nhân không đồng bộ
  • Đối sánh loại

Danh sách cứ kéo dài! Tuy nhiên, vì các bước trong quy trình ETL được xác định rõ ràng và logic, các kỹ sư dữ liệu và phụ trợ thường sẽ lo lắng nhiều hơn về hiệu suất và tính khả dụng hơn là việc triển khai.

Nếu ứng dụng của bạn đang ghi hàng nghìn bản ghi mỗi giây vào MongoDB, thì nhân viên ETL của bạn cần theo kịp với việc chuyển đổi, tải và cung cấp dữ liệu cho người dùng ở biểu mẫu được yêu cầu. Tốc độ và độ trễ có thể trở thành một vấn đề, vì vậy những công nhân này thường được viết bằng ngôn ngữ nhanh. Bạn có thể sử dụng mã đã biên dịch cho bước chuyển đổi để tăng tốc độ, vì phần này thường bị ràng buộc bởi CPU.

Lưu ý: Đa xử lý và tách công nhân là những giải pháp khác mà bạn có thể muốn xem xét.

Nếu bạn đang xử lý nhiều chức năng sử dụng nhiều CPU, thì bạn có thể muốn xem Numba. Thư viện này biên dịch các hàm để thực thi chúng nhanh hơn. Hơn hết, điều này được thực hiện dễ dàng bằng Python, mặc dù có một số hạn chế về những hàm nào có thể được sử dụng trong các hàm đã biên dịch này.



Q9:Các mẫu thiết kế trong Dữ liệu lớn

Hãy tưởng tượng Amazon cần tạo hệ thống giới thiệu để gợi ý cho người dùng những sản phẩm phù hợp. Nhóm khoa học dữ liệu cần dữ liệu và rất nhiều dữ liệu! Họ tìm đến bạn, kỹ sư dữ liệu, và yêu cầu bạn tạo một kho cơ sở dữ liệu theo giai đoạn riêng biệt. Đó là nơi họ sẽ dọn dẹp và chuyển đổi dữ liệu.

Bạn có thể bị sốc khi nhận được yêu cầu như vậy. Khi bạn có hàng terabyte dữ liệu, bạn sẽ cần nhiều máy để xử lý tất cả thông tin đó. Một chức năng tổng hợp cơ sở dữ liệu có thể là một hoạt động rất phức tạp. Làm cách nào để bạn có thể truy vấn, tổng hợp và sử dụng dữ liệu tương đối lớn một cách hiệu quả?

Apache ban đầu đã giới thiệu MapReduce, theo sau bản đồ, xáo trộn, thu nhỏ quy trình làm việc. Ý tưởng là ánh xạ các dữ liệu khác nhau trên các máy riêng biệt, còn được gọi là các cụm. Sau đó, bạn có thể thực hiện công việc trên dữ liệu, được nhóm theo một khóa và cuối cùng, tổng hợp dữ liệu trong giai đoạn cuối cùng.

Quy trình làm việc này vẫn được sử dụng cho đến ngày nay, nhưng gần đây nó đã mờ dần theo hướng có lợi cho Spark. Tuy nhiên, mẫu thiết kế là nền tảng của hầu hết các quy trình làm việc dữ liệu lớn và là một khái niệm rất hấp dẫn. Bạn có thể đọc thêm về MapReduce tại IBM Analytics.



Q10:Các khía cạnh chung của Quy trình ETL và Quy trình làm việc Dữ liệu lớn

Bạn có thể nghĩ đây là một câu hỏi khá kỳ quặc, nhưng nó chỉ đơn giản là một cuộc kiểm tra kiến ​​thức khoa học máy tính cũng như kiến ​​thức và kinh nghiệm thiết kế tổng thể của bạn.

Cả hai quy trình làm việc đều tuân theo Nhà sản xuất-Người tiêu dùng họa tiết. Một công nhân (Nhà sản xuất) tạo ra một số loại dữ liệu và xuất dữ liệu đó ra một đường ống. Đường dẫn này có thể có nhiều dạng, bao gồm cả thông báo mạng và trình kích hoạt. Sau khi Nhà sản xuất xuất dữ liệu, Người tiêu dùng sẽ sử dụng và sử dụng dữ liệu đó. Những công nhân này thường làm việc theo cách không đồng bộ và được thực thi trong các quy trình riêng biệt.

Bạn có thể ví Producer với các bước trích xuất và biến đổi của quy trình ETL. Tương tự, trong dữ liệu lớn, trình lập bản đồ có thể được coi là Nhà sản xuất, trong khi trình giảm bớt hiệu quả là Người tiêu dùng. Sự tách biệt các mối quan tâm này là vô cùng quan trọng và hiệu quả trong việc phát triển và thiết kế kiến ​​trúc của các ứng dụng.




Kết luận

Xin chúc mừng! Bạn đã bao quát rất nhiều điều và trả lời một số câu hỏi phỏng vấn kỹ sư dữ liệu. Giờ đây, bạn đã hiểu thêm một chút về nhiều loại mũ khác nhau mà một kỹ sư dữ liệu có thể đội, cũng như trách nhiệm của bạn đối với cơ sở dữ liệu, thiết kế và quy trình làm việc.

Được trang bị kiến ​​thức này, bây giờ bạn có thể:

  • Sử dụng Python với cơ sở dữ liệu SQL, NoSQL và bộ nhớ cache
  • Sử dụng Python trong ETL và các ứng dụng truy vấn
  • Lập kế hoạch dự án trước thời hạn, lưu ý thiết kế và quy trình làm việc

Mặc dù các câu hỏi phỏng vấn có thể khác nhau, nhưng bạn đã được tiếp xúc với nhiều chủ đề và học cách suy nghĩ bên ngoài trong nhiều lĩnh vực khác nhau của khoa học máy tính. Bây giờ bạn đã sẵn sàng để có một cuộc phỏng vấn tuyệt vời!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cài đặt và cấu hình Zabbix trên Ubuntu 20.04

  2. Cách đếm các giá trị riêng biệt trong SQL

  3. Cách thêm cột trong SQL

  4. Salesforce SOQL từ Java

  5. FrankenQueries:khi SQL và NoSQL xung đột