0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Tại sao tôi chuyển sang sử dụng Parquet cho lưu trữ dữ liệu

Đăng vào 1 tháng trước

• 4 phút đọc

Giới thiệu

Trong quá trình học tập của mình, lần đầu tiên tôi biết đến định dạng tệp Parquet là trong dự án năm thứ tư. Tôi thường thấy Hugging Face giới thiệu định dạng này mỗi khi tôi tải lên một tập dữ liệu tùy chỉnh và tôi tự hỏi: tại sao họ lại thích định dạng tệp này đến vậy?

Đến bây giờ, khi tôi khám phá sâu hơn về lưu trữ đối tượng và hồ dữ liệu, Parquet lại xuất hiện mọi nơi. Sau một thời gian nghiên cứu và thực hành, tôi đã hiểu: định dạng này không chỉ là một cơn sốt. Nó thực sự tốt hơn cho dữ liệu quy mô lớn.

Lợi ích của Parquet

Trước tiên, hãy cùng điểm qua những lợi ích:

  • Đơn giản – dễ đọc/ghi bằng các thư viện phổ biến.
  • Nhanh chóng – tối ưu cho các truy vấn lấy dữ liệu.
  • Tiết kiệm dung lượng – lưu trữ cùng một dữ liệu trong dung lượng ít hơn.
  • Nhận thức về cấu trúc – siêu dữ liệu và cấu trúc gắn liền làm cho chúng hoàn hảo cho hồ dữ liệu.

Khi tôi thấy tất cả điều này, tôi đã nghĩ: Điều này không thể đúng, đúng không?

Phân tích các lợi ích

Đơn giản khi sử dụng

Chuyển đổi một tệp CSV sang Parquet chỉ cần vài dòng mã Python:

python Copy
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

# Ví dụ về dataframe
df = pd.DataFrame({
    "timestamp": ["2025-09-10", "2025-09-11"],
    "symbol": ["BTC", "BTC"],
    "close": [57800, 58800]
})

table = pa.Table.from_pandas(df)
pq.write_table(table, "crypto.parquet")

Chỉ cần như vậy — bạn đã có một tệp Parquet.

Truy vấn nhanh hơn

Khác với CSV, Parquet là định dạng lưu trữ theo cột. Thay vì tổ chức dữ liệu theo hàng, nó lưu trữ giá trị theo cột, giống như một dataframe của pandas.

  • Cần chỉ một cột? Parquet có thể đọc chỉ cột đó thay vì quét toàn bộ tệp.
  • Các công cụ truy vấn (Spark, DuckDB, v.v.) có thể bỏ qua các khối không liên quan hoàn toàn. Điều này làm cho việc truy vấn các tập dữ liệu lớn nhanh hơn đáng kể.

Tiết kiệm dung lượng hơn

Nó lưu trữ nhiều dữ liệu hơn trong ít không gian hơn nếu dữ liệu được lưu trong một tệp CSV, và đây là cách mà nó đạt được điều đó:
Parquet được nén cao theo thiết kế. Một số thủ thuật mà nó sử dụng:

  • Số nguyên - mã hóa nhị phân (ít byte hơn so với văn bản).
  • Chuỗi - mã hóa từ điển (ví dụ, "BTC" được lưu trữ một lần, sau đó được tham chiếu theo chỉ số).
  • Giá trị lặp lại - mã hóa chiều dài chạy (RLE).

Cấu trúc và Siêu dữ liệu

Đây là nơi mà hồ dữ liệu trở nên quan trọng. Tệp Parquet nhận thức về cấu trúc. Điều này có nghĩa là dữ liệu được lưu trữ theo một cấu trúc liên quan, về cơ bản là bản thiết kế của dữ liệu bên trong tệp Parquet.

Nó mô tả:

  • Tên cột
  • Loại dữ liệu (int, float, string, timestamp, boolean, v.v.)
  • Có thể null hay không
  • Cấu trúc lồng nhau (nếu có) Bạn thậm chí có thể định nghĩa cấu trúc của riêng bạn:
python Copy
import pyarrow as pa
import pyarrow.parquet as pq

schema = pa.schema([
    ("timestamp", pa.timestamp("s")),
    ("symbol", pa.string()),
    ("price", pa.float64())
])

data = [
    ["2025-09-10 00:00:00", "BTC", 57800.0],
    ["2025-09-11 00:00:00", "ETH", 1800.5],
]

table = pa.Table.from_arrays(list(zip(*data)), schema=schema)
pq.write_table(table, "crypto_with_schema.parquet")

Parquet cũng hỗ trợ siêu dữ liệu phong phú, điều này rất quan trọng trong hồ dữ liệu. Nếu không có siêu dữ liệu, một hồ dữ liệu nhanh chóng biến thành một “đầm lầy dữ liệu.”

Mỗi tệp Parquet đã lưu trữ siêu dữ liệu cơ bản:

  • Số lượng hàng
  • Số lượng cột
  • Loại dữ liệu
  • Thông tin nén
  • Thống kê cột (giá trị min/max, số lượng null)

Tuy nhiên, bạn cũng có thể thêm siêu dữ liệu tùy chỉnh:

python Copy
pq.write_table(
    table,
    "btc_prices.parquet",
    metadata={
        b"source": b"CoinGecko",
        b"pipeline": b"airflow-crypto-etl",
        b"tokens": b"BTC,ETH,SOL,HYPE,BNB"
    }
)

Truy vấn trong một hồ dữ liệu

Khi các tệp Parquet của bạn nằm trong lưu trữ đối tượng (ví dụ: S3), bạn có thể truy vấn chúng trực tiếp bằng các công cụ hiện đại:

sql Copy
SELECT timestamp, close
FROM 's3://crypto-data/*.parquet'
WHERE symbol = 'BTC' AND timestamp >= '2025-09-01'

Điều này làm cho Parquet trở thành một lựa chọn tự nhiên cho các công cụ như Spark, DuckDB và Presto.

Kết luận

Parquet không chỉ là một định dạng tệp khác. Nó là một cách lưu trữ dữ liệu gọn nhẹ, nhanh chóng và nhận thức về cấu trúc, hoàn toàn phù hợp với các hồ dữ liệu hiện đại. Nếu bạn quan tâm đến hiệu suất, hiệu quả lưu trữ và khả năng mở rộng lâu dài, Parquet là lựa chọn không cần bàn cãi.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào