Basaltic-Red
Bộ công cụ gia tốc Data Lake & kiểm soát chất lượng dữ liệu bằng Rust + Apache Arrow (Python qua PyO3)
Tổng quan
basaltic-red là lõi tính toán Rust cho data lake dạng file kèm liên kết Python. Chức năng chính bao gồm: catalog ánh xạ bộ nhớ (.br_map.bazan), cắt lát dòng và cột theo khả năng của từng định dạng, lọc chất lượng dữ liệu song song với mã audit theo dòng, và thực thi SQL qua DataFusion trên Arrow batch. Kết quả trả về pyarrow.Table hoặc RecordBatch để sử dụng với Polars, DuckDB hoặc pandas.
Demo trong demo.ipynb: NYC TLC Yellow Taxi từ năm 2009 đến 2025, gồm 204 file Parquet, dung lượng 29.66 GB, 1,826,960,642 dòng nhân 20 cột.
graph LR
A["File thô (204 Parquet / 29.66 GB)"] --> B["Lõi Rust"]
B --> C["Catalog (.br_map.bazan / memmap2)"]
B --> D["Lọc song song (Rayon, 1.82B dòng)"]
B --> E["SQL stream (DataFusion)"]
D --> F["Clean (1.78B)"]
D --> G["Trash (46.7M + mã audit)"]
E --> H["DuckDB / Polars"]
Chức năng chính
- Catalog (
.br_map.bazan): một payload Arrow IPC ở gốc lake; đọc warm quamemmap2tránh duyệt cây thư mục. Doctor trả vềHEALTHY,DRIFT_DETECTED, hoặcHEALED. - Cắt lát:
slice_rowsvàslice_colstrả về khoảng dữ liệu được yêu cầu. Map khỏe cho phép reader hỗ trợ bỏ qua block không liên quan; một số định dạng vẫn phải giải mã thêm dữ liệu, còn XLSX materialize worksheet qua Calamine. - Lọc: quy tắc động theo định dạng
cột toán_tử giá_trị; dòng lỗi mangaudit_error_code(bitmasku64, chia chunk khi số quy tắc vượt quá 64). - SQL: phiên DataFusion;
execute_sql_streamtrả vềPyBatchIterator,to_pyarrow()bàn giao Arrow batch cho Polars hoặc DuckDB. Buffer tương thích có thể được dùng chung ở ranh giới Arrow interop; reader và bước chuyển đổi phía sau vẫn có thể giải mã hoặc materialize dữ liệu. - Định dạng: đăng ký định dạng phân cách tùy chỉnh qua
br.formats.register_delimited; đọc trực tiếp một file có thể nhận diện một số file không có extension bằng magic byte. Discovery thư mục của Lake Map, Lake Doctor vàfilter_files_paralleldựa trên extension và cần handler đang hoạt động.
Kết quả đo trong demo
Một lần chạy demo.ipynb trên Apple Silicon Mac. Tùy thuộc phần cứng, cung cấp để tham khảo.
| Kịch bản | Phạm vi | Quan sát |
|---|---|---|
| Catalog cold vs warm | 204 file | Tạo cold mất ~18.07 s; đọc warm mất ~0.5 ms (trung bình 5 lần) |
| Quét khối lượng (chỉ metadata) | 1,826,960,642 dòng | < 1 s (~0.7 s) |
| Lọc toàn lake (5 rule) | 1,826,960,642 dòng | ~21 s (1,780,228,507 dòng sạch / 46,732,135 dòng rác) |
SQL GROUP BY một file |
4,305,006 dòng | ~0.1 s |
Vòng lặp lọc là Rust thuần trên Arrow array, LLVM tự động vector hóa. Không có intrinsic SIMD viết tay.
Cài đặt nhanh
import basaltic_red as br
report = br.lake.doctor("data/", auto_heal=True)
print(report["status"], report["total_files"])
clean, trash = br.filter.filter_matrix("data/sample.parquet", rules=[
"passenger_count >= 1",
"trip_distance > 0.0",
"fare_amount > 0.0",
])
Xem thêm: Quickstart · Lake Doctor · Benchmarks