CSV là một giải pháp hữu hiệu để lưu trữ dữ liệu?

Chắc hẳn, trong chúng ta ai cũng từng làm việc với tệp CSV. Và cũng rất nhiều người trong chúng ta nghĩ rằng: “CSV là một giải pháp hữu hiệu và tối ưu”. Nhưng bạn đã sai lầm rất nhiều khi nghĩ như thế rồi đó. Việc lưu trữ dữ liệu bằng tệp CSV sẽ khiến chúng ta tốn kém tiền bạc và dung lượng dữ liệu ổ đĩa. Đã đến lúc kết thúc đều đó.

Tôi không chắc bạn đã nghe nói về Parquet chưa. Nhưng nếu bạn chưa biết cũng không sao, vì hôm nay tôi sẽ giới thiệu đến các bạn về Parquet - một định dạng lưu trữ dữ liệu hiệu quả cao.

Trong bài viết này, tôi sẽ giải thích vì sao bạn không nên lưu trữ dữ liệu bằng tệp CSV, định dạng lưu trữ dữ liệu là gì, nó khác với tệp CSV như thế nào và tại sao chúng ta nên sử dụng nó.

Hầu như, tệp CSV có mặt khắp mọi nơi, từ báo cáo của công ty đến các tập dữ liệu của máy học. Nó là một định dạng phổ biến, trực quan và dễ sử dụng. Bạn chỉ cần mở tệp ra là có quyền truy cập trực tiếp vào dữ liệu. Nghe có vẻ rất tiện lợi và tốt, nhưng nó không tốt như bạn nghĩ chút nào. Và dĩ nhiên, bạn cũng có thể có nhiều lựa chọn khác như Excel, SQLite, HDF... nhưng có một đối thủ đang để chúng ta quan tâm đó là Parquet.

Tại sao bạn không nên sử dụng CSV?

Tôi nghĩ rất nhiều người yêu thích tệp CSV và tôi cũng thế. Có rất nhiều phần mềm giúp chúng ta tạo ra tệp CSV một cách dễ dàng và nhanh chóng, kể cả Word hay các trình soạn thảo văn bản khác. Và nếu bạn có sự hứng thú với khoa học dữ liệu và máy học, bạn chỉ cần truy cập Kaggle thì hầu hết tất cả tập dữ liệu dạng CSV.

CSV được định dạng theo hàng, đều này có nghĩa khi muốn sử dụng chúng, bạn phải truy vấn vào từng hàng. Việc này tưởng chừng như rất nhanh và đơn giản, nhưng nó lại khá chậm và khó lưu trữ kết quả. Nhưng nếu bạn sử dụng Parquet - là một định dạng lưu trữ dữ liệu theo cột sẽ có sự khác biệt rất lớn về kích thước nếu các tập dữ liệu giống hệt nhau. Thêm vào đó, tệp CSV dễ dang sử dụng mà không cần qua một bước kiểm tra, xác nhận nào. Đều này sẽ không đảm bảo tính bảo mật và an toàn nếu bạn sử dụng nó làm cơ sở dữ liệu.

Nhưng những vấn đề trên sẽ không là gì khi đề cập đến phạm vi doanh nghiệp. Doanh nghiệp thường quan tâm nhiều hơn đến bài toán tiết kiệm chi phí. Bởi vì khi triển khai một dữ án, họ có thể sẽ lưu trữ dữ liệu trên hệ thống đám mây, làm cơ sở cho các ứng dụng web, mô hình máy học. Do đó, các nhà cung cấp dịch vụ đám mây sẽ tính phí dự trên lượng dữ liệu được quét và lượng dữ liệu được lưu trữ. Để chứng minh cho đều này, bạn hãy xem giá của dịch vụ Amazon S3 sau đây:

Bảng 1 - Giá Amazon S3 với các định dạng dữ liệu khác nhau

Tập dữ liệu Kích thước Amazon S3 Thời gian truy vấn Dữ liệu được quét Giá
Dữ liệu được lưu trữ dạng CSV 1TB 236 giây 1.15TB $5.75
Dữ liệu được lưu trữ dạng Parquet 130GB 6.78 giây 2.51GB $0.01
Tiết kiệm/ Tốc độ nếu sử dụng Parquet 87% Nhanh hơn 34 lần 99% 99.7%

Qua bản dữ liệu bên trên. Chắc chắn, bạn sẽ thấy rằng: "Tệp Parquet sử dụng ít dung lượng ổ đĩa hơn nhiều sơ với CSV, thời gian quét nhanh hơn. Và nếu bạn có một tập dữ liệu giống hệt nhau thì sẽ rẻ hơn 16 lần khi lưu trữ dữ liệu ở định dạng Parquet.

Bây giờ, bạn hãy xem xét tiếp đến Apache Parquet:

Bảng 2 - Lưu trữ Amazon S3 và so sánh giá truy vấn cho các định dạng dữ liệu khác nhau

Tập dữ liệu Cột Kích thước Amazon S3 Dữ liệu được quét Giá
Dữ liệu được lưu trữ dạng CSV 4 4TB 4TB $20
Dữ liệu được lưu trữ dạng GZIP CSV 4 1TB 1TB $5
Dữ liệu được lưu trữ dạng Parquet 4 1TB 0.25TB $1.25

Một lần nữa, bạn thấy Parquet sẽ tiết kiệm hơn 99,7% nếu bạn sử dụng một tệp CSV có kích thước 1TB. Do đó, CSV không phải là một lựa chọn tốt nhất khi dữ liệu của bạn lớn - cả về mặt chi phí và thời gian.

Vậy Parquet là gì?

Parquet là một định dạng thay thế để lưu trữ dữ liệu. Nó được Apache cung cấp dưới dạng mã nguồn mở. Về cơ bản thì cả CSV và Parquet đều dùng để lưu trữ dữ liệu, nhưng chúng có sự khác biệt nhau trong nội bộ. Như đã nói ở trên, CSV được tổ chức dữ liệu trong hàng, còn Parquet thì theo cột. Dưới đây là một ví dụ về một bảng dữ liệu được lưu trữ theo định dạng Parquet:

Bảng 3 - Dữ liệu mẫu

User ID Provinces Status
1 Ho Chi Minh Paid
2 Long An Free
3 Ha Noi Paid
4 Long Dong Paid
5 Tien Giang Free
6 Dong Thap Paid

Hình bên dưới là dữ liệu được tổ chức trong cả vùng lưu trữ cả hàng và cột:

Bảng 4 - Dữ liệu được tổ chức trong cả vùng lưu trữ cả hàng và cột

Dữ liệu tổ chức theo hàng Dữ liệu tổ chức theo cột
Hàng 1 1 User ID 1
Ho Chi Minh 2
Paid 3
Hàng 2 2 4
Long An 5
Free 6
Hàng 3 3 Province Ho Chi Minh
Ha Noi Long An
Paid Ha Noi...

Qua đây, bạn sẽ thấy các tệp lưu trữ theo cột nhẹ hơn, vì có thể thực hiện nén đủ dữ liệu cho mỗi cột. Đó không phải giải pháp lưu trữ hàng, vì một hàng thường chứa nhiều loại dữ liệu.

Apache Parquet được thiết kế để mang lại hiệu quả cho công việc của chúng ta. Vì thế nó cho phép bạn nhanh chóng bỏ qua dữ liệu không liên quan. Bằng cách này, cả việc truy vấn và tổng hợp dữ liệu đều nhanh hơn, dẫn đến tiết kiệm phần cứng.

Tóm lại, Parquet là một định dạng dữ liệu theo cột mang lại hiệu quả hơn cho các tệp lớn hơn. Bạn sẽ tiết kiệm cả thời gian và tiền bạc bằng cách sử dụng Sàn gỗ thay vì CSV.

Nếu bạn là một người yêu thích Python, thì việc làm việc với các tệp CSV trong Pandas nghe có vẻ quen thuộc. Nhưng hãy xem cách thư viện xử lý các tệp Parquet với nội dung tiếp theo. Tôi bảo đảm rằng bạn sẽ rất thích nó.

Làm việc với Parquet như thế nào?

  • Tải tập dữ liệu

Tôi sẽ sử dụng tập dữ liệu cổ phiếu NYSE cho phần thực hành này. Nó là một tập dữ liệu CSV có kích thước 50MB. Bây giờ, tôi sẽ tiến hành chuyển đổi giữa tập dữ liệu định dạng CSV theo định dạng Parquet. Bạn thử xem coi chúng ta tiết kiệm được bao nhiêu dung lượng?

  • Tải và đọc tập dữ liệu CSV với thư viện Pandas

import pandas as pd
df = pd.read_csv('/content/prices.csv')
df.head()

Lưu ý: Thay đổi đường dẫn tập dữ liệu theo đúng đường dẫn trên máy tính của bạn. Để thuận tiện, bạn nên sử dụng Colab Google.

Kết quả:

Result_1a

Hình 1 - Kết quả của tập dữ liệu CSV 

  • Lưu trữ dữ liệu theo định dạng Parquet

Bạn cần sử dụng hàm to_parquet() để lưu trữ tập dữ liệu của chúng ta theo định dạng Parquet, về nguyên tác cơ bản thì nó cũng có chức năng như hàm to_csv()

df.to_parquet(‘/content/prices.parquet')

Kết quả:

Result_1b

Hình 2 - Lưu trữ dữ liệu theo định dạng parquet 

Như thế, dữ liệu của chúng ta đã được lưu trữ dưới tên prices.parquet

Để xác minh tập dữ liệu prices có được lưu theo định dạng parquet chưa, chúng ta sử dụng hàm equals ()

df.equals(df_parquet)

nếu dữ liệu đã được lưu thì sẽ hiển thị kết quả True.

  • Tải và đọc dữ liệu file Parquet

df_parquet = pd.read_parquet('/content/prices.parquet')
df_parquet.head()

Và đây là kết quả hình:

Result_2a

Hình 3 - Kết quả sau khi đọc tệp parquet