Super Sale WeekClaude Skills — 20% OFF
Glossary

Làm chủ tệp Parquet: Cấu trúc, Trường hợp sử dụng và Ưu điểm chính

Powerdrill Bloom·
Làm chủ tệp Parquet: Cấu trúc, Trường hợp sử dụng và Ưu điểm chính

Một tệp Parquet lưu trữ dữ liệu theo cột thay vì theo hàng. Dự án Apache Parquet mô tả nó là "một định dạng tệp dữ liệu hướng cột, mã nguồn mở được thiết kế để lưu trữ và truy xuất dữ liệu hiệu quả." Lựa chọn thiết kế duy nhất đó giải thích tại sao nó nhỏ hơn, truy vấn nhanh hơn và khó mở hơn bằng cách nhấp đúp chuột.

Tệp Parquet là gì?

Parquet là một định dạng tệp dành cho dữ liệu dạng bảng, được duy trì như một dự án Apache. Tài liệu chính thức tuyên bố rằng nó "cung cấp các sơ đồ nén và mã hóa hiệu suất cao để xử lý dữ liệu phức tạp với số lượng lớn." Tài liệu cho biết thêm rằng định dạng này "được hỗ trợ trong nhiều ngôn ngữ lập trình và công cụ phân tích."

Thuộc tính định nghĩa của nó là hướng lưu trữ. Một tệp CSV ghi từng hàng một: mọi trường của bản ghi thứ nhất, sau đó đến mọi trường của bản ghi thứ hai. Parquet ghi từng cột một: mọi giá trị của cột đầu tiên, sau đó đến mọi giá trị của cột thứ hai.

Điều đó nghe có vẻ mang tính kỹ thuật. Nhưng nó dẫn đến hai hệ quả lớn. Các giá trị trong một cột đơn lẻ có xu hướng giống nhau, giúp chúng nén tốt hơn nhiều so với một hàng hỗn hợp. Và một truy vấn chỉ cần ba cột trong số chín mươi cột có thể chỉ đọc đúng ba cột đó, thay vì phải quét mọi hàng để rồi loại bỏ hầu hết chúng.

Định dạng này được đặc tả một cách chính thức. Tài liệu Apache lưu ý rằng "kho lưu trữ parquet-format lưu trữ đặc tả chính thức của định dạng tệp Parquet, định nghĩa cách cấu trúc và lưu trữ dữ liệu."

Cấu trúc của một tệp Parquet

Lớp vỏ bọc

Mỗi tệp Parquet mở đầu và kết thúc bằng cùng bốn byte. Đặc tả chỉ ra một "mã định danh ma thuật (magic number) 4-byte 'PAR1'" ở đầu, và cùng mã định danh ma thuật đó ở cuối cùng.

Nằm giữa chúng là dữ liệu và, ở gần cuối, là siêu dữ liệu (metadata). Ngay trước mã định danh ma thuật kết thúc là "độ dài 4-byte tính bằng byte của siêu dữ liệu tệp (little endian)." Giá trị đó cho trình đọc biết cần nhảy ngược lại bao xa để tìm khối siêu dữ liệu.

Nhóm hàng và phân đoạn cột

Bên trong lớp vỏ bọc, dữ liệu được chia làm hai lần. Đặc tả mô tả một tệp có "N cột trong bảng này, được chia thành M nhóm hàng."

Một nhóm hàng là một lát cắt ngang — một loạt các hàng. Trong mỗi nhóm hàng, các giá trị của mỗi cột được lưu trữ cùng nhau dưới dạng một phân đoạn cột. Vì vậy, một tệp có 90 cột và 10 nhóm hàng sẽ chứa 900 phân đoạn cột, mỗi phân đoạn là một chuỗi các giá trị liên tiếp từ một cột duy nhất.

Việc phân chia kép này là yếu tố giúp việc đọc có chọn lọc khả thi. Một truy vấn có thể bỏ qua toàn bộ các nhóm hàng không chứa các hàng phù hợp, sau đó chỉ đọc các phân đoạn cột mà nó cần từ những nhóm hàng còn lại.

Tại sao siêu dữ liệu lại nằm ở cuối

Điều này gây ngạc nhiên cho những ai mong đợi một phần đầu tệp (header). Tài liệu Apache giải thích trực tiếp lý do: "siêu dữ liệu tệp được ghi sau dữ liệu để cho phép ghi trong một lượt duy nhất (single pass writing)."

Một trình ghi đang truyền phát một tập dữ liệu lớn sẽ không biết vị trí byte cuối cùng của mỗi phân đoạn cho đến khi nó ghi xong chúng. Việc đặt siêu dữ liệu ở cuối cùng đồng nghĩa với việc nó không bao giờ phải quay lại và vá phần đầu tệp.

Quy trình đọc cũng tuân theo nguyên lý này. Theo tài liệu, siêu dữ liệu tệp "chứa vị trí của tất cả các vị trí bắt đầu của phân đoạn cột." Tài liệu cho biết thêm rằng "trình đọc dự kiến sẽ đọc siêu dữ liệu tệp trước tiên để tìm tất cả các phân đoạn cột mà họ quan tâm."

Parquet được dùng để làm gì

Bạn thường sẽ gặp tệp .parquet trong một trong bốn tình huống sau.

Xuất dữ liệu từ kho dữ liệu (Data warehouse). Khi ai đó xuất một bảng lớn từ một kho dữ liệu hiện đại, đây thường là lựa chọn mặc định, vì tệp vẫn giữ được kích thước dễ quản lý.

Lưu trữ hồ dữ liệu (Data lake). Các tệp nằm trong kho lưu trữ đối tượng đám mây thường sử dụng định dạng này, chính xác là vì các công cụ có thể đọc một tập hợp con các cột mà không cần tải xuống mọi thứ.

Bàn giao giữa các nhóm. Một kỹ sư dữ liệu gửi cho bạn dữ liệu giao dịch của một năm thường sẽ chọn định dạng này thay vì một tệp CSV có kích thước lớn hơn gấp nhiều lần.

Trao đổi giữa các công cụ phân tích. Vì định dạng này được hỗ trợ trên nhiều ngôn ngữ và công cụ, nó có thể di chuyển giữa các hệ thống mà không cần bước chuyển đổi ở giữa.

Điểm chung ở đây là kích thước. Nó trở thành lựa chọn hiển nhiên tại thời điểm mà một tệp CSV không còn dễ dàng để di chuyển qua lại nữa.

Parquet so với CSV

Parquet CSV
Hướng lưu trữ Hướng cột Hướng hàng
Có thể đọc được trong trình chỉnh sửa văn bản Không, nó là tệp nhị phân
Kích thước tệp điển hình Nhỏ hơn, nhờ nén theo cột Lớn hơn cho cùng một lượng dữ liệu
Đọc một vài cột Chỉ đọc các phân đoạn cột đó Đọc toàn bộ tệp
Kiểu dữ liệu Được mang theo trong siêu dữ liệu tệp Được suy luận bởi bất kỳ công cụ nào mở nó
Mở bằng cách nhấp đúp chuột Thường là không Thường mở trong bảng tính
Tốt nhất cho Các bảng lớn, truy vấn lặp đi lặp lại Các bảng nhỏ, kiểm tra nhanh, chia sẻ phổ biến

Hành vi của kiểu dữ liệu xứng đáng được lưu ý. Một tệp CSV không thể biết liệu 00123 là một số hay một chuỗi, đó là lý do tại sao các số không ở đầu và ngày tháng bị xáo trộn khi nhập. Parquet ghi lại các kiểu dữ liệu trong siêu dữ liệu của nó, vì vậy giá trị bạn ghi chính là giá trị bạn đọc lại.

Đối với khía cạnh hướng hàng của phép so sánh này, bài giải thích về CSV đề cập đến cùng một vấn đề từ hướng ngược lại. Bài phân tích về TSV đề cập đến biến thể phân tách bằng tab.

Các ưu điểm chính

Nén hiệu quả vượt trội. Việc lưu trữ các giá trị tương tự cạnh nhau giúp bộ mã hóa có nhiều dữ liệu tối ưu hơn để xử lý. Tài liệu Apache ghi nhận "các sơ đồ nén và mã hóa hiệu suất cao."

Cắt tỉa cột (Column pruning). Việc đọc ba trong số chín mươi cột chỉ tiêu tốn khoảng ba cột I/O thay vì chín mươi.

Bỏ qua nhóm hàng (Row group skipping). Vì siêu dữ liệu ghi lại những gì có trong mỗi nhóm hàng, trình đọc có thể loại bỏ toàn bộ các lát cắt trước khi chạm vào chúng.

Kiểu dữ liệu được bảo toàn. Ngày tháng vẫn là ngày tháng và các mã định danh vẫn giữ nguyên các số không ở đầu, bởi vì lược đồ (schema) đi kèm bên trong tệp.

Ghi một lượt (Single-pass writing). Siêu dữ liệu ở cuối đồng nghĩa với việc các tệp rất lớn có thể được ghi dưới dạng một luồng dữ liệu (stream).

Hỗ trợ rộng rãi. Tài liệu lưu ý sự hỗ trợ trên "mã nguồn mở và nhiều ngôn ngữ lập trình cùng công cụ phân tích," vì vậy nó hiếm khi gặp phải rào cản tương thích.

Những điểm hạn chế của Parquet

Parquet giải quyết vấn đề lưu trữ và truy xuất. Nó không giải quyết bất kỳ câu hỏi nào của bạn về những gì thực sự có trong tệp.

Nó là tệp nhị phân, vì vậy bạn không thể nhìn lướt qua nó. Việc mở một tệp CSV để kiểm tra xem cột doanh thu là tổng doanh thu hay doanh thu thuần chỉ mất năm giây. Một tệp nhị phân cần có một công cụ hỗ trợ trước khi bạn có thể nhìn thấy bất cứ thứ gì.

Nó cũng không phù hợp với dữ liệu nhỏ. Đối với một bảng tra cứu gồm 200 hàng, chi phí hao phí của siêu dữ liệu và yêu cầu về công cụ sẽ vượt quá bất kỳ lợi ích nén nào mang lại. CSV là định dạng tốt hơn trong trường hợp đó, và việc nhìn nhận thực tế về điều đó là một phần của việc sử dụng Parquet hiệu quả.

And nó không nói lên điều gì về chất lượng dữ liệu. Tệp có thể chứa những thông tin vô nghĩa được định kiểu hoàn hảo và nén hiệu quả. Các bản ghi trùng lặp, một cột tiền tệ trộn lẫn hai loại tiền tệ, một ID khách hàng đã thay đổi lược đồ vào tháng Ba. Định dạng này đảm bảo tính trung thực của dữ liệu, chứ không phải tính chính xác.

Cách làm việc với tệp Parquet nếu bạn không phải là kỹ sư

Đây là khoảng cách thực tế. Hầu hết các công cụ kinh doanh đều giả định sử dụng bảng tính, và một tệp .parquet sẽ không mở theo cách của một tệp CSV.

Con đường thực tế nhất là thực hiện một bước chuyển đổi. Hãy yêu cầu người tạo ra tệp cung cấp một bản trích xuất CSV hoặc Excel của các cột bạn thực sự cần, hoặc tự chuyển đổi nó bằng bất kỳ công cụ nào hỗ trợ Parquet. Bạn sẽ mất đi lợi ích nén, nhưng điều đó không quan trọng khi dữ liệu đã nằm trên máy của bạn và được thu hẹp phạm vi.

Từ đó, công việc chỉ là phân tích thông thường. Trang bảng giá của Powerdrill Bloom liệt kê các tệp tải lên cho Excel, CSV, PDF và tài liệu, vì vậy một bản trích xuất đã chuyển đổi có thể được đưa trực tiếp vào. Các câu hỏi được đặt bằng ngôn ngữ tự nhiên thay vì được viết dưới dạng các câu truy vấn. Trợ lý CSV AI assistant hỗ trợ lộ trình đó, và các data connectors hỗ trợ các trường hợp dữ liệu được truy xuất trực tiếp tốt hơn là xuất ra tệp.

Sự khác biệt đáng lưu ý là Parquet là một quyết định lưu trữ được đưa ra ở phía thượng nguồn trước khi đến tay bạn. Nó không phải là một công cụ phân tích, và việc chuyển đổi nó sang định dạng khác khi tệp đến bàn làm việc của bạn là điều bình thường chứ không phải là một giải pháp tạm thời.

Kết luận

Parquet là giải pháp lưu trữ hướng cột với lược đồ và chỉ mục nằm ở cuối tệp. Thiết kế đó mang lại khả năng nén, đọc có chọn lọc và các kiểu dữ liệu đáng tin cậy, đó là lý do tại sao nó trở thành lựa chọn mặc định cho bất kỳ dữ liệu lớn nào.

Những gì nó không mang lại là khả năng hiển thị trực quan. Ngay khi tệp đến tay một người cần câu trả lời hơn là lưu trữ, bước tiếp theo hữu ích thường là một bản trích xuất có phạm vi thu hẹp và một câu hỏi.

Nếu đó là tình huống của bạn, hãy thử Powerdrill Bloom với tệp đã chuyển đổi và bắt đầu bằng cách chuyển đổi nó thành biểu đồ.

Câu hỏi thường gặp

Tệp Parquet được dùng để làm gì?

Parquet được sử dụng để lưu trữ các tập dữ liệu dạng bảng lớn một cách hiệu quả. Nó phổ biến cho việc xuất dữ liệu từ kho dữ liệu, lưu trữ hồ dữ liệu, bàn giao giữa các nhóm và trao đổi giữa các công cụ phân tích. Lý do là nó nén tốt và hỗ trợ chỉ đọc các cột được chọn.

Parquet có tốt hơn CSV không?

Đối với các bảng lớn được truy vấn lặp đi lặp lại thì có: nó nhỏ hơn, mang theo các kiểu dữ liệu và hỗ trợ cắt tỉa cột. Đối với các bảng nhỏ bạn cần kiểm tra hoặc chia sẻ rộng rãi, CSV sẽ dễ dàng hơn vì nó là văn bản và có thể mở ở bất kỳ đâu.

Tôi có thể mở tệp Parquet trong Excel không?

Không thể mở bằng cách nhấp đúp chuột, vì Parquet là định dạng nhị phân chứ không phải văn bản. Cách tiếp cận phổ biến là chuyển đổi nó sang CSV hoặc Excel trước, hoặc sử dụng một công cụ đọc trực tiếp Parquet.

Tại sao siêu dữ liệu Parquet được lưu trữ ở cuối tệp?

Tài liệu Apache giải thích rằng siêu dữ liệu được ghi sau dữ liệu "để cho phép ghi trong một lượt duy nhất." Một trình ghi đang truyền phát một tập dữ liệu lớn không biết trước vị trí phân đoạn cuối cùng, vì vậy việc ghi siêu dữ liệu ở cuối cùng sẽ tránh được việc phải quay lại phần đầu tệp.

Nhóm hàng trong Parquet là gì?

Một nhóm hàng là một lát cắt ngang của bảng. Đặc tả mô tả các cột của một tệp được "chia thành M nhóm hàng," với mỗi cột được lưu trữ dưới dạng một phân đoạn riêng biệt bên trong mỗi nhóm. Bố cục đó cho phép trình đọc bỏ qua cả các nhóm và các cột mà họ không cần.