Lê Duy Khương (Daniel)

Chuỗi: lakehouse-glossary · Phần 4

Năng suất & công cụ dev

Tối ưu định dạng file – Parquet, Delta, Z-Ordering

Tối ưu định dạng file trong Lakehouse: Parquet, Delta, Z-Ordering. Chi phí lưu trữ, hiệu năng truy vấn và best practices.

2026-03-173 phút đọcVI


1. Khái niệm

  • File Format Optimization là tập hợp các kỹ thuật để tối ưu hóa hiệu suất lưu trữ và truy xuất dữ liệu thông qua cấu trúc file, cách tổ chức cột, và layout vật lý trên storage.

  • Trong kiến trúc Lakehouse, các định dạng phổ biến gồm:

    • Parquet – định dạng cột, nén tốt, tối ưu cho analytical queries
    • Delta – mở rộng Parquet với khả năng ACID, time travel, schema evolution
    • Z-Ordering – kỹ thuật sắp xếp dữ liệu để tăng tốc độ lọc truy vấn

2. Vì sao quan trọng?

Khía cạnhLợi ích thực tế
Storage costNén hiệu quả giúp giảm chi phí lưu trữ
Query performanceGiảm IO, tăng tốc scan dữ liệu
ScalabilityTối ưu partition + layout giúp hệ thống scale tốt
ReliabilityHỗ trợ rollback, audit, merge tốt hơn

3. So sánh định dạng file

Đặc điểmCSVParquetDelta
Lưu trữ dạng cộtKhông
Hỗ trợ schemaKhôngCó (schema evolution)
Hỗ trợ ACIDKhôngKhông
Time travelKhôngKhông
Merge / DeleteKhôngKhôngCó (compaction)

4. Z-Ordering – kỹ thuật sắp xếp vật lý

Z-Ordering là cách reorder lại dữ liệu trong file Parquet theo các cột hay dùng để lọc, giúp:

  • Spark đọc ít file hơn (data skipping)
  • Tăng tốc query có điều kiện lọc trên WHERE
# Ví dụ: Z-Ordering trên cột customer_id
spark.sql("""
  OPTIMIZE delta.`/lake/transactions`
  ZORDER BY (customer_id)
""")

5. Best practices

Ngữ cảnhChiến lược file format
Batch loading lớnDùng Parquet hoặc Delta, chia nhỏ file ~100–250MB
Truy vấn theo ngàyPartition theo event_date, Z-Order theo customer_id
Use case streaming + batchDùng Delta + auto compaction + checkpoint
Cần versioning và auditDùng Delta với VACUUM định kỳ

6. Cách ghi Parquet và Delta trong Spark

# Ghi Parquet
df.write.mode("overwrite").parquet("/lake/parquet/customers")
 
# Ghi Delta với overwrite schema
df.write.format("delta") \
  .option("overwriteSchema", "true") \
  .mode("overwrite") \
  .save("/lake/delta/customers")

7. Tối ưu hóa file nhỏ

Dữ liệu ghi dạng streaming hoặc nhiều batch nhỏ → tạo nhiều file nhỏ (small files problem)

→ Giải pháp:

# Gộp file nhỏ bằng repartition trước khi ghi
df.repartition(8).write.format("delta").mode("append").save("/lake/delta/")

8. Tích hợp vào pipeline

LayerHành động đề xuất
Raw LayerChỉ lưu CSV hoặc JSON (thô), không optimize
StagingConvert sang Parquet, kiểm tra schema, ghi Delta
SilverGộp file nhỏ (compaction), Z-Order theo cột dùng để lọc (e.g. mã khách hàng)
GoldPartition theo ngày/tháng, dùng Delta + checkpoint

9. KPIs theo dõi hiệu quả

Chỉ sốÝ nghĩa
File Size trung bình~100–250MB là tối ưu cho scan song song
% File nhỏ (<10MB)<5% là tốt
Query latency (p95)Tăng nhanh nếu không Z-Order tốt
Time to refresh Delta TablePhải <10 phút nếu dùng trong dashboard hoặc model ML

10. Hành động tiếp theo

  1. Kiểm kê lại toàn bộ bảng đang lưu dạng CSV → chuyển sang Parquet/Delta
  2. Benchmark truy vấn count, filter, group by trên Delta vs Parquet
  3. Thiết lập routine OPTIMIZE + VACUUM trên bảng lớn
  4. Xác định các cột lọc thường dùng → đề xuất ZORDER BY
  5. Refactor pipeline để tự động convert + optimize sau mỗi batch
LDK

Le Duy Khuong

AI Transformation & Digital Strategy. Writing about agentic systems, engineering leadership, and building in public.