- Data Lake và Data Warehouse khác nhau như thế nào? Khi nào dùng mỗi loại?
- Change Data Capture (CDC) là gì? Cách hoạt động và use cases? (What is Change Data Capture (CDC)? How it works and use cases?)
- Kafka Connect là gì? Nó giải quyết bài toán gì trong data pipeline?
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,…
- Schema Registry trong Kafka ecosystem là gì? Tại sao cần dùng Avro/Protobuf thay vì JSON?
- At-least-once vs at-most-once vs exactly-once trong Kafka: phân biệt và cách đạt được mỗi loại?
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à gì? Khi nào dùng Redshift thay vì RDS? Giải thích columnar storage và distribution styles.
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 và denormalization là gì? Đánh đổi ra sao?
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 và materialized view khác nhau thế nào?
- 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…
- OLTP và OLAP khác nhau thế nào?
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 là gì? Khác GROUP BY thế nào?
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…
- Star schema và snowflake schema khác nhau thế nào (mô hình chiều)?
- Bài tập SQL thường gặp: tìm lương cao thứ 2 / top-N mỗi nhóm viết thế nào?
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…
- Kafka Streams và Apache Flink — khi nào chọn cái nào?
- Thứ tự thực thi logic của một câu SELECT là gì? Vì sao nó khác thứ tự bạn viết?
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ô.…
- Tính running total bằng window function thế nào? `ROWS` và `RANGE` trong frame clause khác nhau ra sao?
- Bảng log 500 triệu dòng, chỉ query 30 ngày gần nhất — thiết kế partition theo thời gian thế nào? Partition pruning cần điều kiện gì?
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 làm công việc gì? Vai trò này khác Data Analyst và Data Scientist ở điểm nào?
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à gì? Dựa vào đâu để biết một bài toán là bài toán dữ liệu lớn?
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,…
- Vì sao data lake thường lưu file Parquet thay vì CSV? Avro hợp với trường hợp nào?
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…
- Thiết kế pipeline đưa dữ liệu đơn hàng từ MySQL production lên data warehouse để làm báo cáo doanh thu hằng ngày. Bạn làm thế nào?
- ETL gồm những bước nào? Mô tả một quy trình ETL cơ bản.
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…
- ETL và ELT khác nhau thế nào? Khi nào nên chọn cái nào?
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…
- Job ETL lỗi giữa chừng, chạy lại thì bảng đích bị trùng dữ liệu. Bạn thiết kế pipeline thế nào để chạy lại và backfill an toàn?
- Lakehouse là gì? Nó hơn data lake kiểu cũ (file trên HDFS/S3) ở điểm nào?
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…
- Kiến trúc medallion (bronze, silver, gold) là gì? Vì sao nên chia dữ liệu thành nhiều tầng như vậy?
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…
- Query báo cáo trên warehouse (BigQuery, Redshift, Snowflake) chạy chậm và tốn tiền. Bạn tối ưu thế nào?
- Surrogate key là gì? Vì sao bảng dimension không dùng luôn khoá gốc (natural key) của hệ thống nguồ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 của một fact table là gì? Có những loại fact table nào và khi nào dùng loại nào?
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…
- Slowly Changing Dimension (SCD) là gì? SCD type 1 và type 2 khác nhau thế nào?
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…
- Bảng staging có bản ghi trùng vì nguồn gửi lại cùng một sự kiện nhiều lần. Bạn dedup bằng SQL thế nào trước khi nạp vào bảng chính?
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…
- Incremental load khác full load thế nào? Viết truy vấn nạp tăng dần theo watermark ra sao?
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…
- Viết SQL cập nhật một dimension theo SCD type 2 thế nào khi có dữ liệu mới từ nguồn?
- Kiến trúc Apache Spark gồm những thành phần nào? Driver và executor làm gì khi một job chạy?
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 và action trong Spark khác nhau thế nào? Vì sao Spark đánh giá lười (lazy evaluation)?
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…
- Narrow và wide transformation trong Spark khác nhau thế nào? Vì sao shuffle là bước tốn kém nhất?
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…
- Hadoop MapReduce và Apache Spark khác nhau thế nào? Vì sao Spark thường nhanh hơn?
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…
- Data skew trong Spark là gì? Phát hiện và xử lý thế nào?
- Batch processing và stream processing khác nhau thế nào? Khi nào nên chọn cái nào?
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…
- Khi đồng bộ dữ liệu từ database của ứng dụng sang warehouse, CDC kiểu query-based (quét theo updated_at) và log-based khác nhau thế nào? Chọn cách nào?
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ó…
- Trong xử lý stream, event time khác processing time thế nào? Xử lý dữ liệu đến trễ bằng watermark ra sao?
- Apache Airflow dùng để làm gì? Giải thích DAG, task và operator.
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 —…
- Trong Airflow, muốn DAG chờ tới khi một sự kiện xảy ra (file xuất hiện trên S3, DAG khác chạy xong) thì dùng gì? Sensor hoạt động ra sao?
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ờ…
- Trong Airflow, data interval, logical date, catchup và retries hoạt động thế nào? Làm sao chạy lại dữ liệu cho các ngày cũ (backfill)?
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.…
- Kiểm tra chất lượng dữ liệu (data quality check) trong pipeline gồm những loại nào? Nên đặt chúng ở đâu?
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à gì? Nó giải quyết vấn đề gì giữa team backend và team data?
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…
- Một Spark job chạy hằng ngày trước mất 20 phút, giờ mất 2 tiếng. Bạn debug thế nào?
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, DataFrame và Dataset trong Spark khác nhau thế nào? Khi viết job mới nên dùng API nào?
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…
- `cache()` và `persist()` trong Spark khác nhau thế nào? Khi nào nên cache một DataFrame?
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,…
- `repartition()` và `coalesce()` trong Spark khác nhau thế nào? Trước khi ghi file nên dùng cái nào?
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 và PySpark khác nhau thế nào? Khi nào Data Engineer nên chọn cái nào?
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…
- Cần xử lý một file CSV 20GB bằng Python trên máy chỉ có 8GB RAM. Bạn làm thế nào?
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.…
- Spark chọn chiến lược join thế nào? Broadcast hash join và sort-merge join khác nhau ra sao?
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" trên data lake là gì? Vì sao nó làm job chậm và xử lý thế nào?
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…
- Viết SQL tìm những user đăng nhập ít nhất 3 ngày liên tiếp (bài gaps and islands).
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ị…
- Từ bảng clickstream (user_id, event_time), viết SQL chia sự kiện thành session, biết session kết thúc khi user không có hoạt động quá 30 phút.
- Kimball, Inmon và Data Vault khác nhau thế nào khi thiết kế data warehouse? Khi nào chọn cách nào?
Đâ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…
- Delta Lake, Apache Iceberg và Apache Hudi khác nhau thế nào? Bạn chọn table format nào cho lakehouse và dựa trên tiêu chí gì?
- Data lineage và data catalog là gì? Unity Catalog khác Hive Metastore ở điểm nào?
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,…
- Bạn test một data pipeline thế nào trước và sau khi đưa lên production?
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…
- Thiết kế luồng đưa sự kiện từ Kafka vào data lake bằng Spark Structured Streaming sao cho không mất và không trùng dữ liệu khi job restart.
- Pipeline có dữ liệu cá nhân (số điện thoại, số CCCD, email). Bạn thiết kế thế nào để tuân thủ luật bảo vệ dữ liệu cá nhân, kể cả khi user yêu cầu xoá dữ liệu?
- Thiết kế pipeline thu thập và phân tích clickstream (lượt xem trang, click) cho một website thương mại điện tử khoảng 10TB sự kiện mỗi ngày.