DHDataHọc
TheoryLesson 6/84 min read+10 XP

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.

code
extract → transform → load → check → publish

Nế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 traCâu hỏiVí dụ
Không rỗngCó dòng nào không?COUNT(*) > 0
Không thiếuCột quan trọng có NULL?NULL ở order_id = 0
Duy nhấtKhoá có trùng?COUNT(*) = COUNT(DISTINCT order_id)
Miền giá trịSố có hợp lý?amount >= 0
Tham chiếuCó khoá mồ côi?customer_id không tồn tại
Độ tươiDữ 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

code
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:

code
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ứcHành độngVí dụ
ChặnKhông cho dữ liệu đi tiếpSố dòng dưới 50% kỳ vọng
Cảnh báoChạy tiếp, gửi thông báoSố dòng giảm 20%
Ghi nhậnChỉ lưu lạiTỷ 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ỗ:

  1. Sau khi nạp vào staging: bắt lỗi nguồn trước khi ảnh hưởng bảng chính.
  2. Sau khi biến đổi: bắt lỗi logic.
  3. 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:

code
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

code
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

  1. Viết kiểm tra số dòng tối thiểu.
  2. Viết kiểm tra order_id duy nhất.
  3. Viết kiểm tra amount >= 0.
  4. Viết kiểm tra khoá mồ côi.
  5. Thiết kế bảng dq_results và ghi ba lần kiểm tra.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Bảng rỗng nhưng DAG xanhKhông kiểm tra số dòngThêm COUNT(*)
Báo cáo thiếu dòngKhoá mồ côiKiểm tra tham chiếu
Pipeline dừng liên tụcNgưỡng quá chặtTách warn và fail
Không biết lỗi từ khi nàoKhông lưu kết quảBảng audit
Dữ liệu sai đã công bốKiểm tra đặt quá muộnChặ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.

Use ← → to move between lessons