Tổng hợp 62 câu hỏi phỏng vấn Data Engineering kèm đáp án chi tiết, song ngữ Việt–Anh — sắp xếp từ cơ bản đến nâng cao. Ôn luyện miễn phí, tự động lưu tiến độ.
Kafka Connect là framework tích hợp sẵn trong Kafka ecosystem để kết nối Kafka với các external system (database, file system, cloud storage, search engine) mà không cần viết code. Kafka Connect có hai loại connector: Source Connector (đọc data từ external system vào Kafka,…
At-most-once (fire-and-forget): producer đặt acks=0, consumer commit offset trước khi xử lý. Message có thể mất nhưng không bao giờ trùng. Hợp với metrics, log — những thứ không cần chính xác tuyệt đối. At-least-once: producer đặt acks=all kèm retries, consumer commit sau khi xử…
Amazon Redshift là petabyte-scale data warehouse dựa trên columnar storage, tối ưu cho OLAP (Online Analytical Processing) — complex queries trên large datasets, reporting, BI. Khác biệt với OLTP (RDS): Redshift lưu data theo cột thay vì hàng, giúp compression tốt hơn và scan nhanh…
Normalization: tổ chức dữ liệu để loại trùng lặp — tách thành nhiều bảng liên kết bằng khoá, mỗi dữ kiện lưu một chỗ (theo các dạng chuẩn 1NF/2NF/3NF). - Lợi: ghi/cập nhật gọn, tránh dữ liệu mâu thuẫn, tiết kiệm dung lượng. - Hại:…
- View: một truy vấn lưu sẵn dưới dạng tên gọi — không lưu dữ liệu. Mỗi lần query view, DB chạy lại câu SQL bên dưới trên dữ liệu hiện tại → luôn mới, không tốn storage, nhưng nặng nếu truy vấn phức tạp…
Hai loại workload dữ liệu, tối ưu cho mục đích khác nhau: OLTP (Online Transaction Processing) — hệ giao dịch chạy ứng dụng: - Nhiều giao dịch nhỏ, nhanh: đọc/ghi vài hàng (đặt đơn, cập nhật hồ sơ). - Cần ACID, độ trễ thấp, đồng…
Window function tính toán trên một tập hàng liên quan tới hàng hiện tại nhưng không gộp các hàng lại — mỗi hàng gốc vẫn được giữ, kèm thêm giá trị tính được. Nhận biết qua mệnh đề OVER (...). Khác GROUP BY: - GROUP…
Hai bài "vào tay" xuất hiện trong hầu hết vòng SQL: Lương cao thứ 2 (phải xử lý trùng lương và trường hợp không tồn tại): Dùng DENSERANK (không phải ROWNUMBER/RANK) vì lương trùng phải tính cùng một hạng, không nhảy số. Biến thể LIMIT…
Câu SELECT được viết theo thứ tự SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY, nhưng được hiểu theo logic gần như ngược lại: 1. FROM + JOIN — dựng tập dòng nguồn. 2. WHERE — lọc từng dòng thô.…
Dùng declarative range partitioning theo cột thời gian, mỗi tháng (hoặc mỗi tuần nếu lượng ghi lớn) một partition. Lợi ích chính không phải là truy vấn nhanh hơn, mà là vòng đời dữ liệu: xoá dữ liệu cũ bằng drop table requestlogs202601 chạy tức…
Data Engineer xây và vận hành đường đi của dữ liệu: gom dữ liệu từ các hệ thống nguồn về một chỗ, làm sạch, tổ chức lại để người khác dùng được. Data Analyst và Data Scientist là người dùng dữ liệu đó. Data Engineer…
Big data là dữ liệu mà công cụ thông thường (một database đơn lẻ, một file Excel) không còn xử lý kịp, vì quá lớn, đến quá nhanh hoặc quá nhiều dạng. Hay được mô tả bằng 5V: - Volume — dung lượng: hàng TB,…
Parquet lưu theo cột (columnar), còn CSV và Avro lưu theo dòng. Truy vấn phân tích thường chỉ đọc vài cột trên hàng triệu dòng, nên lưu theo cột giúp đọc ít dữ liệu hơn nhiều. CSV Avro Parquet ------------ Cách lưu Theo dòng, dạng…
ETL là ba bước đưa dữ liệu từ nguồn vào kho phân tích: Extract (lấy ra), Transform (biến đổi), Load (nạp vào). - Extract — đọc dữ liệu từ nguồn: database ứng dụng, API, file CSV từ đối tác, log. Thường chỉ lấy phần mới…
Khác nhau ở chỗ biến đổi dữ liệu: ETL biến đổi trước khi nạp vào kho, ELT nạp dữ liệu thô vào kho trước rồi biến đổi ngay bên trong kho bằng SQL. ETL ELT --------- Biến đổi ở đâu Engine riêng (Spark, Informatica, script…
Lakehouse là data lake (file Parquet trên S3/HDFS, lưu rẻ) được thêm một lớp table format như Delta Lake, Apache Iceberg hay Apache Hudi, để có các tính năng vốn chỉ warehouse mới có. Data lake cũ chỉ là một thư mục file. Nó gặp…
Medallion là cách chia dữ liệu trong lakehouse thành ba tầng, mỗi tầng sạch và gần nghiệp vụ hơn tầng trước. Tầng Chứa gì Ví dụ --------- Bronze Dữ liệu thô, giữ nguyên như nguồn, chỉ thêm thời điểm nạp JSON event từ Kafka, bản…
Surrogate key là khoá do warehouse tự sinh (thường là số nguyên tăng dần hoặc hash), không mang nghĩa nghiệp vụ. Natural key là khoá có sẵn từ hệ thống nguồn, như mã khách hàng KH00123 hay email. Dimension dùng surrogate key vì: - Lưu…
Grain là câu trả lời cho "một dòng trong fact table đại diện cho cái gì". Ví dụ: một dòng là một sản phẩm trong một đơn hàng, hay một dòng là tổng doanh thu một cửa hàng trong một ngày. Grain phải chốt trước…
SCD là cách xử lý khi thuộc tính của một dimension thay đổi theo thời gian, ví dụ khách hàng đổi địa chỉ, sản phẩm đổi danh mục. Câu hỏi cốt lõi: báo cáo cũ nên hiển thị giá trị cũ hay mới? Type 1…
Trước hết phải xác định thế nào là trùng: trùng toàn bộ các cột, hay cùng khoá nghiệp vụ (orderid) nhưng khác phiên bản. Hai trường hợp xử lý khác nhau. Trùng toàn bộ cột: SELECT DISTINCT là đủ. Cùng khoá, nhiều phiên bản: đánh…
Full load đọc lại toàn bộ bảng nguồn mỗi lần chạy. Incremental load chỉ lấy phần mới hoặc thay đổi kể từ lần chạy trước, dựa vào một mốc gọi là watermark (thường là updatedat lớn nhất đã nạp). Full load đơn giản và luôn…
Spark chạy theo mô hình một driver điều phối, nhiều executor làm việc. Driver giữ kế hoạch tính toán; executor là các process trên worker node, thực sự đọc dữ liệu và chạy task. - Driver — process chạy hàm main() và tạo SparkSession. Nó…
Transformation tạo DataFrame mới từ DataFrame cũ (filter, select, join, groupBy) và không chạy ngay — Spark chỉ ghi nó vào kế hoạch. Action (count, collect, show, write) mới buộc Spark thực thi toàn bộ chuỗi phía trước. Vì sao lazy: thấy cả chuỗi trước…
Khác nhau ở chỗ một partition đầu ra cần dữ liệu từ bao nhiêu partition đầu vào. - Narrow (filter, select, map, union): mỗi partition đầu ra chỉ phụ thuộc một partition đầu vào, nên xử lý ngay trên executor đang giữ dữ liệu, không…
Cả hai đều xử lý phân tán theo tư tưởng map → gom theo key → reduce. Khác biệt lớn nhất nằm ở chỗ lưu kết quả trung gian. Hadoop MapReduce Spark --------- Kết quả trung gian Ghi xuống HDFS sau mỗi job Giữ trong…
Batch xử lý một khối dữ liệu đã tích luỹ theo lịch (mỗi giờ, mỗi đêm); stream xử lý liên tục từng sự kiện hoặc từng micro-batch nhỏ ngay khi dữ liệu tới. Batch Stream --------- Độ trễ Phút đến giờ Mili giây đến giây…
Cả hai đều lấy phần thay đổi thay vì copy lại cả bảng mỗi lần. Khác nhau ở chỗ lấy thay đổi từ đâu. Query-based (polling) — định kỳ chạy một query như sau: - Dễ làm, chỉ cần quyền đọc và cột updatedat có…
Airflow là công cụ điều phối (orchestration) pipeline: định nghĩa bằng Python các bước cần chạy, thứ tự và lịch chạy; scheduler lo chạy đúng giờ, retry khi lỗi, còn UI cho thấy bước nào hỏng. Airflow không tự xử lý dữ liệu nặng —…
Dùng Sensor — operator chỉ làm một việc: kiểm tra định kỳ một điều kiện, đúng thì chuyển success để task sau chạy, quá timeout thì fail. Sensor hay gặp: - S3KeySensor, GCSObjectExistenceSensor — chờ file đối tác đẩy lên bucket. - ExternalTaskSensor — chờ…
Logical date (tên cũ executiondate) là mốc thời gian mà một DAG run đại diện, còn data interval là khoảng dữ liệu run đó phụ trách. Cách Airflow tính hai mốc này đổi giữa Airflow 2 và 3, và đây là chỗ hay bị hỏi.…
Data quality check là các khẳng định tự động về dữ liệu, chạy như một bước của pipeline: đạt thì đi tiếp, không đạt thì cảnh báo hoặc dừng trước khi số sai lên dashboard. Các nhóm kiểm tra, theo câu hỏi mà mỗi nhóm…
Data contract là thoả thuận kiểm tra được bằng máy giữa bên sinh dữ liệu (thường là team backend sở hữu DB hoặc event) và bên dùng dữ liệu: schema gồm cột nào, kiểu gì, ràng buộc gì, ai chịu trách nhiệm, và thay đổi…
Bắt đầu từ cái gì đã thay đổi, rồi mới tới tuning. Phần lớn trường hợp nguyên nhân nằm ở dữ liệu hoặc code, không phải cấu hình. 1. Khoanh vùng: job chậm dần theo ngày (dữ liệu tăng) hay chậm đột ngột từ một…
RDD (Resilient Distributed Dataset) là API tầng thấp: một tập object phân tán mà Spark không biết bên trong có những cột gì. DataFrame là dữ liệu dạng bảng có schema (tên cột, kiểu), nên Spark SQL tối ưu được. Dataset là DataFrame có kiểu…
Cả hai đều giữ lại kết quả đã tính của một DataFrame để các action sau dùng lại, thay vì tính lại từ nguồn. cache() chính là persist() với storage level mặc định, còn persist() cho bạn chọn storage level. - DataFrame: mặc định MEMORYANDDISKDESER,…
Cả hai đều đổi số partition của DataFrame. repartition(n) luôn shuffle toàn bộ dữ liệu để chia lại cho đều, tăng hay giảm số partition đều được. coalesce(n) chỉ giảm số partition bằng cách gộp các partition sẵn có, không shuffle. repartition(n) coalesce(n) --------- Shuffle…
pandas xử lý dữ liệu trong RAM của một máy và chạy từng lệnh ngay (eager). PySpark chia dữ liệu thành partition, xử lý song song trên nhiều executor và chạy lazy, tới khi gặp action mới thực thi. pandas PySpark --------- Quy mô Vừa…
Nguyên tắc là không đọc cả file vào bộ nhớ: đọc từng phần, xử lý, ghi ra hoặc cộng dồn kết quả rồi bỏ phần đó đi. Khi đó bộ nhớ dùng chỉ phụ thuộc kích thước một phần, không phụ thuộc kích thước file.…
Với join theo điều kiện bằng (equi-join), Spark chủ yếu chọn giữa các cách sau, dựa trên kích thước ước lượng của hai bảng: - Broadcast hash join: bảng nhỏ được gửi nguyên bản tới mọi executor, mỗi partition của bảng lớn join tại chỗ.…
Small files problem là khi một bảng gồm rất nhiều file nhỏ (vài KB tới vài MB) thay vì ít file cỡ 128MB–1GB. Tổng dữ liệu không đổi nhưng mọi lần đọc đều chậm đi, vì chi phí liệt kê, mở file và đọc metadata…
Mẹo là lấy ngày trừ đi số thứ tự của chính nó: trong một chuỗi ngày liên tiếp, ngày tăng 1 và ROWNUMBER() cũng tăng 1 nên hiệu số không đổi. Chuỗi bị ngắt thì hiệu số nhảy sang giá trị khác. Mỗi giá trị…
Đây là ba cách tổ chức warehouse: Kimball xây từ dưới lên bằng mô hình chiều (star schema) theo từng quy trình nghiệp vụ, Inmon xây từ trên xuống một kho trung tâm chuẩn hoá 3NF, Data Vault tách khoá, quan hệ và thuộc tính…
Data catalog là nơi tra cứu dữ liệu đang có: bảng nào, cột gì, ai sở hữu, mô tả, mức độ nhạy cảm. Data lineage là đồ thị cho biết dữ liệu đi từ đâu tới đâu: bảng gold.revenuedaily được tính từ những bảng nào,…
Pipeline có hai thứ cần kiểm tra: code biến đổi có đúng logic không và dữ liệu thật đi qua có đúng kỳ vọng không. Unit test chạy trên dữ liệu giả nhỏ trước khi merge; data test chạy trên dữ liệu thật mỗi lần…