Kiểm tra chất lượng dữ liệu
Bạn sẽ học được
- Sáu kiểm tra chất lượng dữ liệu cần có trong pipeline.
- Viết kiểm tra bằng SQL và dừng pipeline khi hỏng.
- Phân biệt ngưỡng cảnh báo và ngưỡng chặn.
- Ghi kết quả kiểm tra để theo dõi xu hướng.
- Đặt kiểm tra đúng vị trí trong DAG.
Khái niệm cốt lõi
Một pipeline chạy xong không có nghĩa dữ liệu đúng. Task có thể thành công với 0 dòng, với cột toàn NULL, hoặc với dữ liệu của ngày khác.
Kiểm tra chất lượng là các task độc lập, chạy sau khi nạp và trước khi dữ liệu được dùng.
extract → transform → load → check → publishNếu check thất bại, publish không chạy. Người dùng không thấy dữ liệu sai.
Sáu kiểm tra cơ bản
| Kiểm tra | Câu hỏi | Ví dụ |
|---|---|---|
| Không rỗng | Có dòng nào không? | COUNT(*) > 0 |
| Không thiếu | Cột quan trọng có NULL? | NULL ở order_id = 0 |
| Duy nhất | Khoá có trùng? | COUNT(*) = COUNT(DISTINCT order_id) |
| Miền giá trị | Số có hợp lý? | amount >= 0 |
| Tham chiếu | Có khoá mồ côi? | customer_id không tồn tại |
| Độ tươi | Dữ liệu có mới? | Bản ghi mới nhất trong 26 giờ |
Ba kiểm tra đầu bắt được phần lớn sự cố thực tế.
Viết kiểm tra
from airflow.exceptions import AirflowException
from airflow.decorators import task
@task
def check_row_count(ds=None):
actual = query_one(
"SELECT COUNT(*) FROM staging_orders WHERE order_date = %s",
(ds,),
)
expected = 12000
if actual < expected * 0.8:
raise AirflowException(
f"{ds}: chỉ có {actual} dòng, dưới 80% kỳ vọng ({expected})"
)AirflowException làm task thất bại, chặn các task phía sau.
Với kiểm tra phức tạp, để SQL trả về các dòng vi phạm rồi kiểm tra số dòng:
SELECT order_id
FROM staging_orders
WHERE order_date = '2026-03-01'
AND (amount IS NULL OR amount < 0);Nếu truy vấn trả về bất kỳ dòng nào, dữ liệu có vấn đề.
Ngưỡng cảnh báo và ngưỡng chặn
Không phải mọi bất thường đều cần dừng pipeline.
| Mức | Hành động | Ví dụ |
|---|---|---|
| Chặn | Không cho dữ liệu đi tiếp | Số dòng dưới 50% kỳ vọng |
| Cảnh báo | Chạy tiếp, gửi thông báo | Số dòng giảm 20% |
| Ghi nhận | Chỉ lưu lại | Tỷ lệ NULL tăng nhẹ |
Ngưỡng chặn nên bảo vệ khỏi thảm hoạ, không phải bắt mọi dao động bình thường. Đặt quá chặt sẽ khiến pipeline dừng liên tục và mọi người bắt đầu bỏ qua cảnh báo.
Vị trí đặt kiểm tra
Đặt kiểm tra ở ba chỗ:
- Sau khi nạp vào staging: bắt lỗi nguồn trước khi ảnh hưởng bảng chính.
- Sau khi biến đổi: bắt lỗi logic.
- Trước khi công bố: chốt chặn cuối cùng.
Không đặt kiểm tra chỉ ở cuối — khi đó bảng chính đã bị ghi sai.
Bảng audit
Ghi mọi lần kiểm tra để xem xu hướng:
CREATE TABLE dq_results (
run_id text NOT NULL,
check_name text NOT NULL,
logical_date date NOT NULL,
status text NOT NULL, -- 'pass' | 'warn' | 'fail'
metric numeric,
threshold numeric,
checked_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (run_id, check_name)
);Với bảng này, có thể trả lời: kiểm tra nào hay hỏng nhất, tỷ lệ NULL đang tăng hay giảm, lần cuối dữ liệu sạch là khi nào.
Kiểm tra tham chiếu
SELECT COUNT(*) AS mo_coi
FROM fact_orders f
LEFT JOIN dim_customers c ON c.customer_id = f.customer_id
WHERE c.customer_id IS NULL;Khoá mồ côi thường do thứ tự chạy: fact được nạp trước dim. Sửa bằng cách thêm phụ thuộc giữa DAG, hoặc chấp nhận và xử lý riêng.
Lỗi thường gặp
- Chỉ kiểm tra task thành công: không kiểm tra nội dung.
- Không có kiểm tra số dòng: nguồn rỗng vẫn chạy tiếp.
- Ngưỡng quá chặt: pipeline dừng liên tục.
- Kiểm tra sau khi công bố: người dùng đã thấy dữ liệu sai.
- Không lưu kết quả: không biết xu hướng.
- Bỏ qua khoá mồ côi: báo cáo thiếu dòng mà không rõ lý do.
Thực hành
- Viết kiểm tra số dòng tối thiểu.
- Viết kiểm tra
order_idduy nhất. - Viết kiểm tra
amount >= 0. - Viết kiểm tra khoá mồ côi.
- Thiết kế bảng
dq_resultsvà ghi ba lần kiểm tra.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Bảng rỗng nhưng DAG xanh | Không kiểm tra số dòng | Thêm COUNT(*) |
| Báo cáo thiếu dòng | Khoá mồ côi | Kiểm tra tham chiếu |
| Pipeline dừng liên tục | Ngưỡng quá chặt | Tách warn và fail |
| Không biết lỗi từ khi nào | Không lưu kết quả | Bảng audit |
| Dữ liệu sai đã công bố | Kiểm tra đặt quá muộn | Chặn trước publish |
Tóm tắt
- Task thành công không có nghĩa dữ liệu đúng.
- Sáu kiểm tra: rỗng, thiếu, duy nhất, miền, tham chiếu, độ tươi.
- Tách ngưỡng cảnh báo và ngưỡng chặn.
- Đặt kiểm tra trước khi công bố.
- Lưu kết quả để theo dõi xu hướng.
Dùng ← → để chuyển bài