Lõi MatrixEngine
MatrixEngine (src/engine/mod.rs) là struct duy nhất đứng sau mọi lệnh của SDK. Nó mang bốn ngưỡng chất lượng dữ liệu dùng cho đường tắt lọc tĩnh và preview_sample:
pub struct MatrixEngine {
pub min_passenger: i64, // mặc định 1
pub max_passenger: i64, // mặc định 9
pub min_fare: f64, // mặc định 0.01
pub max_speed_mph: f64, // mặc định 100.0; dùng khi có timestamp taxi
}
Khởi tạo
import basaltic_red as br
# Singleton dùng chung cho mọi lệnh br.<group>.* (ngưỡng 1, 9, 0.01, 100.0)
br.read.slice_rows(...)
# Ngưỡng tùy chỉnh cho mục đích nâng cao
engine = br.MatrixEngine(
min_passenger=0,
max_passenger=20,
min_fare=-5.0,
max_speed_mph=200.0,
)
br.MatrixEngine(...) nhận tham số theo vị trí hoặc từ khóa. Các ngưỡng này dùng để thiết lập tiêu chuẩn lọc tĩnh (static validation). Instance dùng chung được tạo một lần mỗi tiến trình qua OnceLock, nên ngưỡng không bao giờ lệch nhau giữa các lệnh con.
Thao tác cắt lát (Slicing)
Cài đặt trong src/engine/slice.rs; phơi ra qua br.read.*:
| Phương thức | Hành vi |
|---|---|
slice_rows(file_path, offset, limit) |
Parquet, ORC, Avro và MsgPack phân giải row group/stripe/block native khỏe từ .br_map.bazan; XLSX bắt đầu XlsxRows từ block dòng logic của worksheet đã lập chỉ mục (Calamine vẫn materialize worksheet); NDJSON/JSONL và JSON-array nhảy tới checkpoint đã lập chỉ mục; CSV/TSV/PSV/TXT nhảy tới block dòng đã lập chỉ mục; Arrow IPC/Feather nhảy tới RecordBatch đã lập chỉ mục. Các nhánh này sau đó áp dụng offset/limit cục bộ; định dạng khác vẫn stream và bỏ qua batch. |
slice_cols(file_path, selected_cols, offset, limit) |
Cùng cách phân giải vị trí. Parquet, Arrow IPC/Feather và ORC chuyển phép chiếu xuống reader. Delimited mapped parse cột được chọn nhưng vẫn đọc byte của từng record; định dạng theo dòng khác thường decode các dòng được chọn rồi mới project. Nếu không có locator phù hợp, handler có thể stream và bỏ qua dòng trước. Thứ tự cột đầu ra theo selected_cols. |
preview_sample(file_path, limit_rows) |
Mở batch đầu tiên và chạy bộ lọc ngưỡng tĩnh; trả về (clean_table, trash_table). |
Cả hai phương thức slice đều phân giải handler qua registry định dạng, nên hỗ trợ các định dạng đã đăng ký ngoài Parquet. Locator trong map tùy theo định dạng; handler fallback có thể stream và bỏ qua từ đầu. XLSX bắt đầu ở dòng logic đã lập chỉ mục sau khi Calamine materialize worksheet.
Phân loại lỗi
Toàn bộ lỗi engine đi qua một enum duy nhất, BazanError trong src/error.rs, được ánh xạ sang Python bởi một hàm duy nhất (src/pyapi/mod.rs):
| Variant Rust | Exception Python | Nguyên nhân thường gặp |
|---|---|---|
UnsupportedFormat(_) |
ValueError |
Extension chưa đăng ký và sniff thất bại |
DataFusion(_) |
RuntimeError |
Lỗi parse/thực thi SQL |
còn lại (Message, IO, Arrow) |
IOError |
Thiếu tệp, tệp rỗng, dữ liệu hỏng |
Lỗi cú pháp quy tắc phát sinh trước khi thực thi được trả về dưới dạng ValueError ngay từ bộ phân tích quy tắc.
Lọc Tĩnh vs Động
- Đường tắt tĩnh (
src/filter.rs+engine/filter.rs): ba cờ bit cố định, khoảng passenger, mức giá tối thiểu và bất thường tốc độ/distance-fare. Passenger hỗ trợ cả dạngInt64vàFloat64có trong dữ liệu TLC. Khi có timestamp pickup/dropoff, tốc độ được tính từ khoảng cách và thời lượng; schema khác dùng fallback distance/fare cũ. Dùng choprocess_batch/process_file/process_and_write_lake/preview_sample. - Nhân động (
engine/dynamic_filter.rs): quy tắc người dùng tùy ý parsed từ chuỗi trên mọi kiểu cột được hỗ trợ. Xem Nhân SIMD Bitmask.