Phát hiện schema drift bằng AI trước khi job báo cáo làm hỏng dashboard
Một cột đổi kiểu, đổi tên hoặc thay đổi khả năng nhận NULL có thể khiến SQL, pandas và dashboard lệch kết quả. Playbook này giúp lưu baseline schema, so sánh metadata, rồi dùng AI diễn giải diff thành checklist xác minh trước refresh.
Một dashboard có thể refresh thành công nhưng KPI lại biến động bất thường. Không nhất thiết lỗi nằm ở DAX, SQL hay biểu đồ: một cột khóa join có thể đổi kiểu, một trường có thể chuyển sang cho phép NULL, hoặc tên cột ở nguồn đã thay đổi.
Đó là schema drift — khi cấu trúc dữ liệu hiện tại không còn khớp với giả định của job báo cáo, semantic model và dashboard. Pipeline vẫn có thể chạy, nhưng kết quả cần được kiểm tra lại.
Với analyst và BI developer, một cách thực tế là đặt “hàng rào” trước refresh: lưu schema chuẩn, lấy schema hiện tại, so sánh hai bản snapshot, rồi dùng AI diễn giải phần chênh lệch thành checklist xử lý. AI không thay thế kiểm tra kỹ thuật; nó giúp biến metadata thành các việc cần xác minh rõ ràng hơn.
Schema drift có thể tác động đến dashboard như thế nào?
Schema không chỉ là tên cột. Trong PostgreSQL, view informationschema.columns cung cấp metadata về các cột của bảng hoặc view mà người dùng hiện tại có quyền truy cập. Các cột hệ thống như ctid không xuất hiện trong view này.
| Thuộc tính cần theo dõi | Ý nghĩa khi kiểm tra báo cáo |
|---|---|
| tableschema, tablename | Xác định nguồn dữ liệu |
| columnname | Phát hiện cột thêm, mất hoặc đổi tên |
| ordinalposition | Theo dõi thay đổi vị trí cột |
| datatype | Nhận diện thay đổi kiểu dữ liệu |
| isnullable | Cho biết cột có thể nhận NULL hay không |
| columndefault | Theo dõi thay đổi biểu thức giá trị mặc định |
| numericprecision, numericscale | Theo dõi độ chính xác của kiểu số |
| charactermaximumlength | Theo dõi giới hạn độ dài chuỗi |
Ví dụ, baseline của một bảng có thể gồm:
| columnname | datatype | isnullable |
|---|---|---|
| orderid | integer | NO |
| orderdate | date | NO |
| revenue | numeric | NO |
| customerid | integer | YES |
Nếu snapshot hiện tại cho thấy revenue đổi kiểu hoặc customerid đổi trạng thái nullable, đừng coi refresh là an toàn chỉ vì job chưa báo lỗi.
Các thay đổi như vậy có thể cần được điều tra vì chúng có thể ảnh hưởng đến:
Điều kiện join, đặc biệt với khóa có NULL hoặc khác kiểu dữ liệu.
Phép tính trên cột số.
Bộ lọc và logic xử lý ngày.
Query, Power Query, DAX hoặc calculated field đang gọi tên cột cũ.
Số dòng trống hoặc không ghép được trong kết quả.
Dựng baseline schema từ PostgreSQL
informationschema.columns là nguồn metadata phù hợp để tạo snapshot schema cho bảng hoặc view trong PostgreSQL. Theo tài liệu PostgreSQL, view này chỉ hiển thị các cột mà người dùng hiện tại là chủ sở hữu hoặc có quyền truy cập.
Vì vậy, job kiểm tra schema nên chạy bằng tài khoản có phạm vi quyền phù hợp với pipeline báo cáo. Nếu tài khoản kiểm tra không nhìn thấy một cột, kết quả so sánh có thể tạo cảnh báo không chính xác.
Một baseline nên lưu tối thiểu:
Schema và tên bảng nguồn.
Tên cột.
Vị trí cột.
Kiểu dữ liệu.
Trạng thái nullable.
Default expression, nếu pipeline phụ thuộc vào giá trị mặc định.
Precision, scale hoặc độ dài chuỗi khi chúng ảnh hưởng đến đầu ra.
> ordinalposition hữu ích để phát hiện thay đổi, nhưng không nhất thiết là lỗi nghiêm trọng. Query báo cáo nên tránh phụ thuộc vào SELECT ; đổi tên cột, kiểu dữ liệu và nullable thường đáng ưu tiên kiểm tra hơn.
So sánh snapshot bằng pandas
Khi đã có baseline và schema hiện tại dưới dạng DataFrame, bạn có thể dùng pandas.DataFrame.compare() để so sánh từng ô và hiển thị phần khác biệt.
python
df.compare(dfcurrent)
Đặt nhãn cho hai phía để output dễ đọc hơn:
python
df.compare(
dfcurrent,
resultnames=("baseline", "current")
)
Kết quả đặt giá trị của hai phía cạnh nhau, phù hợp để rà soát thay đổi như NO thành YES ở isnullable, hoặc kiểu dữ liệu cũ sang kiểu mới.
Nếu muốn giữ toàn bộ khung dữ liệu khi rà soát:
python
df.compare(
dfcurrent,
keepshape=True,
keepequal=True,
resultnames=("baseline", "current")
)
Giới hạn quan trọng của compare()
DataFrame.compare() chỉ hoạt động khi hai DataFrame có cùng shape và nhãn giống hệt nhau. Nếu baseline có cột mà snapshot hiện tại không có, hoặc xuất hiện cột mới, phương thức sẽ phát sinh ValueError.
Do đó, quy trình kiểm tra nên tách thành hai pha:
So sánh tập nhãn: xác định bảng hoặc cột nào mới xuất hiện, bị mất hoặc cần rà soát.
Căn chỉnh snapshot: sau khi đã xử lý khác biệt về nhãn, dùng compare() để xem thuộc tính nào thay đổi.
compare() phù hợp để soi thay đổi thuộc tính. Nó không tự phân loại đầy đủ cột thêm hoặc mất cho bạn.
Dùng AI để diễn giải diff, không để AI tự phán quyết
Khi lớp kiểm tra đã tạo diff, AI có thể hỗ trợ chuyển thay đổi kỹ thuật thành rủi ro cần xác minh và checklist cho người phụ trách.
Bạn có thể dùng prompt trong công cụ AI nội bộ hoặc công cụ đã được doanh nghiệp phê duyệt:
text
Bạn là reviewer dữ liệu cho dashboard BI.
Schema baseline:
<dán schema đã ẩn dữ liệu nhạy cảm>
Schema hiện tại:
<dán schema đã ẩn dữ liệu nhạy cảm>
Danh sách thay đổi:
<dán cột thêm, cột mất và output compare>
Hãy trả lời theo các mục:
Thay đổi nào có thể ảnh hưởng đến SQL, join, DAX hoặc refresh dashboard?
Thay đổi nào cần kiểm tra NULL, kiểu dữ liệu, date filter và tổng tiền?
Phân loại: chặn refresh / cần xác minh / chỉ theo dõi.
Viết checklist xác minh cho analyst.
Không suy đoán cột, bảng hoặc logic ngoài thông tin được cung cấp.
AI nên đưa ra giả thuyết kiểm tra, không phải kết luận thay bạn. Ví dụ:
Khóa join cho phép NULL: kiểm tra số dòng không ghép được.
Kiểu cột số thay đổi: đối chiếu tổng trước và sau.
Cột ngày thay đổi: rà lại điều kiện lọc trong SQL và semantic model.
Cột bị xóa hoặc đổi tên: tìm dependency trong query, Power Query, DAX và biểu đồ.
AI không tự biết ý nghĩa nghiệp vụ, quan hệ join hay lịch refresh thực tế nếu bạn không cung cấp thông tin đó. Vì vậy, quyết định cho phép refresh vẫn cần người chịu trách nhiệm xác nhận.
Xác minh trước khi mở lại refresh
Sau khi có checklist, hãy kiểm tra bằng dữ liệu và logic thật:
Chạy query hoặc model trên sample đã được phê duyệt.
Đối chiếu số dòng, tổng tiền và số giá trị NULL với baseline phù hợp.
Kiểm tra khóa join có đổi kiểu, có giá trị trống hoặc làm tăng số dòng sau join không.
Kiểm tra date filter: trường ngày có còn đúng kiểu và đúng phạm vi không.
Rà lại các cột được gọi trong SQL, DAX, Power Query và calculated field.
Xác nhận tài khoản lấy metadata có đủ quyền nhìn thấy các cột cần kiểm tra.
Với DataFrame.compare(), các giá trị NaN khớp nhau không được hiển thị là khác biệt. Điều đó chỉ nói rằng hai DataFrame có giá trị thiếu giống nhau tại vị trí tương ứng; nó không khẳng định NULL là an toàn về mặt nghiệp vụ.
Checklist trước mỗi lần refresh rủi ro
[ ] Có snapshot baseline cho các nguồn dữ liệu quan trọng.
[ ] Đã kiểm tra riêng cột thêm, cột mất và thuộc tính cột thay đổi.
[ ] Đã ưu tiên datatype, isnullable, tên cột và các cột dùng để join.
[ ] Đã đối chiếu số dòng, tổng tiền, NULL và date filter.
[ ] AI chỉ nhận metadata và sample đã ẩn dữ liệu nhạy cảm.
[ ] Có người phụ trách xác nhận trước khi mở lại refresh.
Schema drift không chỉ là việc của data engineer. Với BI developer, đây là lớp kiểm soát giúp dashboard không chỉ refresh được, mà còn đáng tin để phục vụ quyết định kinh doanh.
Nguồn tham khảo
PostgreSQL: informationschema.columns
pandas: DataFrame.compare