Nhận Kích thước và Hình dạng của khung dữ liệu. Để có được số hàng và số cột trong pyspark, chúng ta sẽ sử dụng các hàm như hàm count[] và hàm length[]. Kích thước của khung dữ liệu trong pyspark được tính bằng cách trích xuất số hàng và số cột của khung dữ liệu. Chúng tôi cũng sẽ nhận được số lượng hàng riêng biệt trong pyspark. Hãy xem làm thế nào để
- Nhận kích thước và hình dạng của khung dữ liệu không gì khác ngoài số hàng và số cột của khung dữ liệu trong pyspark
Dự án Apache Parquet cung cấp định dạng lưu trữ dạng cột mã nguồn mở được tiêu chuẩn hóa để sử dụng trong các hệ thống phân tích dữ liệu. Ban đầu, nó được tạo để sử dụng trong Apache Hadoop với các hệ thống như Apache Drill, Apache Hive, Apache Impala và Apache Spark sử dụng nó làm tiêu chuẩn dùng chung cho IO dữ liệu hiệu suất cao
Mũi tên Apache là lớp vận chuyển trong bộ nhớ lý tưởng cho dữ liệu đang được đọc hoặc ghi bằng tệp Parquet. Chúng tôi đã đồng thời phát triển triển khai C++ của Apache Parquet, bao gồm bộ điều hợp C++ gốc, đa luồng đến và từ dữ liệu Mũi tên trong bộ nhớ. PyArrow bao gồm các liên kết Python với mã này, do đó cũng cho phép đọc và ghi các tệp Parquet bằng gấu trúc
Lấy pyarrow với Hỗ trợ sàn gỗ
Nếu bạn đã cài đặt
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
5 với pip hoặc conda, thì nó phải được xây dựng với gói hỗ trợ Sàn gỗIn [1]: import pyarrow.parquet as pq
Nếu bạn đang xây dựng
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
5 từ nguồn, bạn phải sử dụngIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
7 khi biên dịch thư viện C++ và bật tiện ích mở rộng Parquet khi xây dựngIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
5. Nếu bạn muốn sử dụng Parquet Encryption, thì bạn cũng phải sử dụngIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
9 khi biên dịch các thư viện C++. Xem trang Phát triển Python để biết thêm chi tiếtĐọc và ghi các tệp đơn lẻ
Hàm
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
0 vàIn [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
1 đọc và viết pyarrow. Đối tượng bảng, tương ứngHãy nhìn vào một bảng đơn giản
________số 8
Chúng tôi viết điều này sang định dạng Parquet với
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
2In [1]: import pyarrow.parquet as pq
0Điều này tạo ra một tập tin Parquet duy nhất. Trong thực tế, tập dữ liệu Parquet có thể bao gồm nhiều tệp trong nhiều thư mục. Chúng tôi có thể đọc lại một tệp với
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
3In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
Bạn có thể chuyển một tập hợp con các cột để đọc, có thể nhanh hơn nhiều so với đọc toàn bộ tệp [do bố cục cột]
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
Khi đọc một tập hợp con các cột từ một tệp sử dụng khung dữ liệu Pandas làm nguồn, chúng tôi sử dụng
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
4 để duy trì mọi dữ liệu cột chỉ mục bổ sungIn [1]: import pyarrow.parquet as pq
5Chúng tôi không cần sử dụng một chuỗi để chỉ định nguồn gốc của tệp. Nó có thể là bất kỳ của
Đường dẫn tệp dưới dạng chuỗi
Tệp gốc từ PyArrow
Một đối tượng tệp Python
Nói chung, một đối tượng tệp Python sẽ có hiệu suất đọc kém nhất, trong khi đường dẫn tệp chuỗi hoặc một thể hiện của
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
5 [đặc biệt là bản đồ bộ nhớ] sẽ hoạt động tốt nhấtĐọc sàn gỗ và ánh xạ bộ nhớ
Vì dữ liệu Parquet cần được giải mã từ định dạng và nén Parquet nên không thể ánh xạ trực tiếp từ đĩa. Do đó, tùy chọn
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
6 có thể hoạt động tốt hơn trên một số hệ thống nhưng sẽ không giúp ích nhiều cho việc tiêu thụ bộ nhớ thường trúIn [1]: import pyarrow.parquet as pq
8Nếu bạn cần xử lý dữ liệu Parquet lớn hơn bộ nhớ, Bộ dữ liệu dạng bảng và phân vùng có lẽ là thứ bạn đang tìm kiếm
Tùy chọn ghi tập tin sàn gỗ
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
1 có một số tùy chọn để kiểm soát các cài đặt khác nhau khi ghi tệp ParquetIn [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
8, phiên bản định dạng Sàn gỗ để sử dụng.In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
9 đảm bảo khả năng tương thích với các đầu đọc cũ hơn, trong khiIn [1]: import pyarrow.parquet as pq
50 và các giá trị lớn hơn cho phép nhiều loại Sàn gỗ và mã hóa hơnIn [1]: import pyarrow.parquet as pq
51, để kiểm soát kích thước gần đúng của các trang dữ liệu được mã hóa trong một đoạn cột. Điều này hiện mặc định là 1MBIn [1]: import pyarrow.parquet as pq
52, để đặt các tùy chọn tương thích dành riêng cho người tiêu dùng Parquet nhưIn [1]: import pyarrow.parquet as pq
53 cho Apache Spark
Xem chuỗi tài liệu
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
1 để biết thêm chi tiếtCó một số tùy chọn bổ sung dành riêng cho việc xử lý loại dữ liệu được mô tả bên dưới
Bỏ qua chỉ mục DataFrame
Khi sử dụng
In [1]: import pyarrow.parquet as pq
55 để chuyển đổi sang bảng Mũi tên, theo mặc định, một hoặc nhiều cột đặc biệt được thêm vào để theo dõi chỉ mục [nhãn hàng]. Việc lưu trữ chỉ mục sẽ tốn thêm dung lượng, vì vậy nếu chỉ mục của bạn không có giá trị, bạn có thể chọn bỏ qua nó bằng cách chuyểnIn [1]: import pyarrow.parquet as pq
56In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
9Sau đó chúng tôi có
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
0Ở đây bạn thấy chỉ số không tồn tại trong chuyến đi khứ hồi
Đọc và Viết chi tiết hơn
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
3 sử dụng lớpIn [1]: import pyarrow.parquet as pq
58, lớp này có các tính năng khácIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
3Như bạn có thể tìm hiểu thêm ở định dạng Parquet của Apache, một tệp Parquet bao gồm nhiều nhóm hàng.
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
3 sẽ đọc tất cả các nhóm hàng và nối chúng vào một bảng duy nhất. Bạn có thể đọc các nhóm hàng riêng lẻ vớiIn [1]: import pyarrow.parquet as pq
80In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
0Tương tự, chúng ta có thể viết một tệp Parquet có nhiều nhóm hàng bằng cách sử dụng
In [1]: import pyarrow.parquet as pq
81In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
1Kiểm tra siêu dữ liệu tệp sàn gỗ
Có thể truy cập
In [1]: import pyarrow.parquet as pq
82 của tệp Sàn gỗ thông quaIn [1]: import pyarrow.parquet as pq
58 như được hiển thị ở trênIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
2hoặc cũng có thể được đọc trực tiếp bằng cách sử dụng
In [1]: import pyarrow.parquet as pq
84In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
3Đối tượng
In [1]: import pyarrow.parquet as pq
82 được trả về cho phép kiểm tra siêu dữ liệu của tệp Parquet, chẳng hạn như các nhóm hàng và siêu dữ liệu khối cột và số liệu thống kêIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
4Xử lý kiểu dữ liệu
Đọc các loại như DictionaryArray
Tùy chọn
In [1]: import pyarrow.parquet as pq
86 trongIn [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
3 vàIn [1]: import pyarrow.parquet as pq
88 sẽ khiến các cột được đọc làIn [1]: import pyarrow.parquet as pq
89, cột này sẽ trở thànhIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
90 khi được chuyển đổi thành pandas. Tùy chọn này chỉ hợp lệ đối với các loại cột chuỗi và nhị phân, đồng thời, tùy chọn này có thể mang lại mức sử dụng bộ nhớ thấp hơn đáng kể và cải thiện hiệu suất cho các cột có nhiều giá trị chuỗi lặp lạiIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
5Khả năng tương thích nén, mã hóa và tệp
Việc triển khai Parquet được sử dụng phổ biến nhất sử dụng mã hóa từ điển khi ghi tệp; . Việc mã hóa từ điển có được sử dụng hay không có thể được chuyển đổi bằng cách sử dụng tùy chọn
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
91In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
6Các trang dữ liệu trong một cột trong một nhóm hàng có thể được nén sau khi mã hóa đi qua [từ điển, mã hóa RLE]. Trong PyArrow, chúng tôi sử dụng tính năng nén Snappy theo mặc định, nhưng Brotli, Gzip, ZSTD, LZ4 và không nén cũng được hỗ trợ
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
7Snappy thường mang lại hiệu suất tốt hơn, trong khi Gzip có thể mang lại các tệp nhỏ hơn
Các cài đặt này cũng có thể được đặt trên cơ sở mỗi cột
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
8Bộ dữ liệu được phân vùng [Nhiều tệp]
Nhiều tệp Parquet tạo thành bộ dữ liệu Parquet. Đây có thể trình bày trong một số cách
Danh sách các đường dẫn tệp tuyệt đối của Parquet
Tên thư mục chứa các thư mục lồng nhau xác định tập dữ liệu được phân vùng
Tập dữ liệu được phân vùng theo năm và tháng có thể giống như trên đĩa
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
9Ghi vào bộ dữ liệu được phân vùng
Bạn có thể viết tập dữ liệu được phân vùng cho bất kỳ hệ thống tệp
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
5 nào là kho lưu trữ tệp [e. g. cục bộ, HDFS, S3]. Hành vi mặc định khi không có hệ thống tệp nào được thêm vào là sử dụng hệ thống tệp cục bộIn [1]: import pyarrow.parquet as pq
00Đường dẫn gốc trong trường hợp này chỉ định thư mục mẹ mà dữ liệu sẽ được lưu vào. Các cột phân vùng là tên cột để phân vùng tập dữ liệu. Các cột được phân vùng theo thứ tự chúng được cung cấp. Sự phân chia phân vùng được xác định bởi các giá trị duy nhất trong các cột phân vùng
Để sử dụng một hệ thống tệp khác, bạn chỉ cần thêm tham số hệ thống tệp, việc ghi bảng riêng lẻ được bao bọc bằng cách sử dụng các câu lệnh
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
93 để không cần phải sử dụng hàmIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
94In [1]: import pyarrow.parquet as pq
01Lưu ý tương thích. nếu sử dụng
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
94 để tạo một bảng mà HIVE sau đó sẽ sử dụng thì các giá trị cột phân vùng phải tương thích với bộ ký tự được phép của phiên bản HIVE mà bạn đang chạyViết các tệp
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
96 vàIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
97Một số khung xử lý như Spark hoặc Dask [tùy chọn] sử dụng tệp
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
96 vàIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
97 với bộ dữ liệu được phân vùngCác tệp đó bao gồm thông tin về lược đồ của tập dữ liệu đầy đủ [đối với
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
97] và có khả năng là tất cả siêu dữ liệu nhóm hàng của tất cả các tệp trong tập dữ liệu được phân vùng [đối vớiIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
96]. Các tệp thực tế là các tệp Parquet chỉ siêu dữ liệu. Lưu ý rằng đây không phải là tiêu chuẩn Sàn gỗ, mà là một quy ước được đặt ra trong thực tế bởi các khuôn khổ đóViệc sử dụng các tệp đó có thể giúp tạo Tập dữ liệu sàn gỗ hiệu quả hơn, vì nó có thể sử dụng lược đồ được lưu trữ và đường dẫn tệp của tất cả các nhóm hàng, thay vì suy luận lược đồ và thu thập thông tin thư mục cho tất cả các tệp Sàn gỗ [trường hợp này đặc biệt dành cho
Hàm
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
02 không tự động ghi các tệp siêu dữ liệu như vậy, nhưng bạn có thể sử dụng hàm này để thu thập siêu dữ liệu, kết hợp và ghi chúng theo cách thủ côngIn [1]: import pyarrow.parquet as pq
02Khi không sử dụng hàm
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
02, nhưng ghi các tệp riêng lẻ của tập dữ liệu được phân vùng bằng cách sử dụngIn [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
1 hoặcIn [1]: import pyarrow.parquet as pq
81, từ khóaIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
06 cũng có thể được sử dụng để thu thập FileMetaData của các tệp đã ghi. Trong trường hợp này, bạn cần đảm bảo tự đặt đường dẫn tệp có trong siêu dữ liệu của nhóm hàng trước khi kết hợp siêu dữ liệu và lược đồ của tất cả các tệp khác nhau cũng như các đối tượng FileMetaData đã thu thập phải giống nhauIn [1]: import pyarrow.parquet as pq
03Đọc từ bộ dữ liệu được phân vùng
Lớp
In [1]: import pyarrow.parquet as pq
88 chấp nhận tên thư mục hoặc danh sách đường dẫn tệp và có thể khám phá và suy ra một số cấu trúc phân vùng phổ biến, chẳng hạn như cấu trúc do Hive tạo raIn [1]: import pyarrow.parquet as pq
04Bạn cũng có thể sử dụng hàm tiện ích
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
3 được cung cấp bởiIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
09 để tránh phải thực hiện bước tạo đối tượng Bộ dữ liệu bổ sungIn [1]: import pyarrow.parquet as pq
05Ghi chú. các cột phân vùng trong bảng gốc sẽ có các loại được chuyển đổi thành các loại từ điển Mũi tên [pandas categorical] khi tải. Thứ tự của các cột phân vùng không được giữ nguyên trong quá trình lưu/tải. Nếu đọc từ hệ thống tệp từ xa vào khung dữ liệu gấu trúc, bạn có thể cần chạy
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
30 để duy trì thứ tự hàng [miễn là tùy chọnIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
31 được bật khi ghi]Ghi chú
ParquetDataset đang được triển khai lại dựa trên API Bộ dữ liệu chung mới [xem tài liệu Bộ dữ liệu dạng bảng để biết tổng quan]. Đây chưa phải là mặc định, nhưng đã có thể được bật bằng cách chuyển từ khóa
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
32 đếnIn [1]: import pyarrow.parquet as pq
88 hoặcIn [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
0In [1]: import pyarrow.parquet as pq
06Kích hoạt tính năng này mang lại các tính năng mới sau đây
Lọc trên tất cả các cột [sử dụng thống kê nhóm hàng] thay vì chỉ lọc trên các khóa phân vùng
Phân vùng chi tiết hơn. hỗ trợ sơ đồ phân vùng thư mục ngoài phân vùng giống như Hive [e. g. “/2019/11/15/” thay vì “/year=2019/month=11/day=15/”] và khả năng chỉ định lược đồ cho các khóa phân vùng
Cải thiện hiệu suất chung và sửa lỗi
Nó cũng có những thay đổi sau đây trong hành vi
Các khóa phân vùng cần được đưa vào từ khóa
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
35 một cách rõ ràng khi bạn muốn đưa chúng vào kết quả trong khi đọc một tập hợp con của các cột
Triển khai mới này đã được bật trong
In [11]: pq.read_table['example.parquet', columns=['one', 'three']] Out[11]: pyarrow.Table one: double three: bool ---- one: [[-1,null,2.5]] three: [[true,false,true]]
3 và trong tương lai, điều này sẽ được bật theo mặc định choIn [1]: import pyarrow.parquet as pq
88. Việc triển khai mới chưa bao gồm tất cả các tính năng ParquetDataset hiện có [e. g. chỉ địnhIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
38 hoặc API thuộc tínhIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
39]. Phản hồi rất được hoan nghênhSử dụng với Spark
Spark đặt một số ràng buộc đối với các loại tệp Parquet mà nó sẽ đọc. Tùy chọn
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
00 sẽ tự động đặt các tùy chọn này và cũng khử trùng các ký tự trường không được Spark SQL hỗ trợĐọc đa luồng
Mỗi chức năng đọc theo mặc định sử dụng đa luồng để đọc các cột song song. Tùy thuộc vào tốc độ của IO và mức độ tốn kém để giải mã các cột trong một tệp cụ thể [đặc biệt là với nén GZIP], điều này có thể mang lại thông lượng dữ liệu cao hơn đáng kể
Điều này có thể bị vô hiệu hóa bằng cách chỉ định
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
01Ghi chú
Số lượng luồng sử dụng đồng thời được Arrow tự động suy ra và có thể được kiểm tra bằng hàm
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
02Đọc từ lưu trữ đám mây
Ngoài các tệp cục bộ, pyarrow hỗ trợ các hệ thống tệp khác, chẳng hạn như hệ thống tệp trên đám mây, thông qua từ khóa
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
03In [1]: import pyarrow.parquet as pq
07Hiện tại,
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
04 vàIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
05 được hỗ trợ. Xem tài liệu Giao diện hệ thống tập tin để biết thêm chi tiết. Đối với các hệ thống tệp tích hợp đó, hệ thống tệp cũng có thể được suy ra từ đường dẫn tệp, nếu được chỉ định dưới dạng URIIn [1]: import pyarrow.parquet as pq
08Các hệ thống tệp khác vẫn có thể được hỗ trợ nếu có sẵn triển khai tương thích với fsspec. Xem Sử dụng hệ thống tệp tương thích fsspec với Mũi tên để biết thêm chi tiết. Một ví dụ là bộ lưu trữ Azure Blob, có thể được giao tiếp thông qua gói adlfs
In [1]: import pyarrow.parquet as pq
09Mã hóa mô-đun sàn gỗ [Mã hóa cột]
Mã hóa cột được hỗ trợ cho các tệp Parquet trong C++ bắt đầu từ Apache Arrow 4. 0. 0 và trong PyArrow bắt đầu từ Apache Arrow 6. 0. 0
Sàn gỗ sử dụng thực hành mã hóa phong bì, trong đó các phần của tệp được mã hóa bằng “khóa mã hóa dữ liệu” [DEK] và DEK được mã hóa bằng “khóa mã hóa chính” [MEK]. DEK được Parquet tạo ngẫu nhiên cho mỗi tệp/cột được mã hóa. MEK được tạo, lưu trữ và quản lý trong Dịch vụ quản lý khóa [KMS] do người dùng lựa chọn
Đọc và ghi các tệp Parquet được mã hóa liên quan đến việc chuyển các thuộc tính mã hóa và giải mã tệp lần lượt tới
In [1]: import pyarrow.parquet as pq
81 và tớiIn [1]: import pyarrow.parquet as pq
58Viết một tệp Parquet được mã hóa
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
0Đọc tệp Parquet được mã hóa
In [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
1Để tạo các thuộc tính mã hóa và giải mã, phải tạo và khởi tạo một
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
08 với thông tin chi tiết về Máy khách KMS, như được mô tả bên dướiKhách hàng KMS
Các khóa mã hóa chính phải được lưu giữ và quản lý trong Hệ thống quản lý khóa cấp sản xuất [KMS], được triển khai trong tổ chức của người dùng. Sử dụng mã hóa Parquet yêu cầu triển khai lớp máy khách cho máy chủ KMS. Bất kỳ triển khai KmsClient nào cũng phải triển khai giao diện không chính thức được xác định bởi
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
09 như sauIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
2Việc triển khai cụ thể sẽ được tải trong thời gian chạy bởi một chức năng xuất xưởng do người dùng cung cấp. Chức năng xuất xưởng này sẽ được sử dụng để khởi tạo
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
08 để tạo các thuộc tính mã hóa và giải mã tệpVí dụ: để sử dụng
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
11 được xác định ở trênIn [9]: table2 = pq.read_table['example.parquet'] In [10]: table2.to_pandas[] Out[10]: one two three a -1.0 foo True b NaN bar False c 2.5 baz True
3Có thể tìm thấy một
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
12 của lớp như vậy cho KMS nguồn mở trong kho lưu trữ Apache Arrow GitHub. Ứng dụng khách KMS sản xuất phải được thiết kế với sự hợp tác của các quản trị viên bảo mật của tổ chức và được xây dựng bởi các nhà phát triển có kinh nghiệm trong quản lý kiểm soát truy cập. Khi một lớp như vậy được tạo, nó có thể được chuyển đến các ứng dụng thông qua một phương thức xuất xưởng và được người dùng PyArrow nói chung tận dụng như được hiển thị trong mẫu ghi/đọc sàn gỗ được mã hóa ở trênCấu hình kết nối KMS
Cấu hình kết nối với KMS [
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
13 được sử dụng khi tạo thuộc tính mã hóa và giải mã tệp] bao gồm các tùy chọn sauIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
14, URL của phiên bản KMSIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
15, ID của phiên bản KMS sẽ được sử dụng để mã hóa [nếu có nhiều phiên bản KMS]In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
16, mã thông báo ủy quyền sẽ được chuyển cho KMSIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
17, một từ điển chuỗi có cấu hình dành riêng cho loại KMS
cấu hình mã hóa
In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
18 [được sử dụng khi tạo thuộc tính mã hóa tệp] bao gồm các tùy chọn sauIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
19, ID của khóa chính để mã hóa/ký chân trangIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
20, mã hóa cột nào bằng khóa nào. Từ điển có ID khóa chính làm khóa và danh sách tên cột làm giá trị, e. g.In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
21In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
22, thuật toán mã hóa Parquet. Có thể làIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
23 [mặc định] hoặcIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
24In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
25, có nên viết chân trang tệp ở dạng văn bản thuần túy hay không [nếu không thì nó được mã hóa]In [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
26, có nên sử dụng gói kép hay không - trong đó các khóa mã hóa dữ liệu [DEK] được mã hóa bằng các khóa mã hóa chính [KEK], sau đó các khóa này được mã hóa bằng các khóa mã hóa chính [MEK]. Nếu được đặt thànhIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
27, gói đơn sẽ được sử dụng - trong đó DEK được mã hóa trực tiếp bằng MEKIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
28, thời gian tồn tại của các thực thể được lưu trong bộ nhớ cache [khóa mã hóa khóa, khóa gói cục bộ, đối tượng máy khách KMS] được biểu thị dưới dạngIn [2]: import numpy as np In [3]: import pandas as pd In [4]: import pyarrow as pa In [5]: df = pd.DataFrame[{'one': [-1, np.nan, 2.5], ...: 'two': ['foo', 'bar', 'baz'], ...: 'three': [True, False, True]}, ...: index=list['abc']] ...: In [6]: table = pa.Table.from_pandas[df]
29Có bao nhiêu hàng trong một tập tin sàn gỗ?
Kích thước tệp trung bình của mỗi tệp Parquet gần như không thay đổi ở mức ~210MB trong khoảng từ 50 triệu đến 251 triệu hàng trước khi tăng lên theo số lượng .Python có thể đọc các tệp sàn gỗ không?
PyArrow bao gồm các liên kết Python với mã này, do đó cũng cho phép đọc và ghi các tệp Parquet bằng gấu trúc .Sàn gỗ siêu dữ liệu là gì?
Sàn gỗ là định dạng tệp mạnh mẽ, một phần vì định dạng này hỗ trợ siêu dữ liệu cho tệp và cột . Lưu trữ lược đồ dữ liệu trong một tệp chính xác hơn so với suy luận lược đồ và ít tẻ nhạt hơn so với chỉ định lược đồ khi đọc tệp.Làm thế nào để Python lưu trữ dữ liệu ở định dạng sàn gỗ?
Giải thích .Dòng 1–2. Chúng tôi nhập các gói pandas và osDòng 4. Chúng tôi xác định dữ liệu để xây dựng khung dữ liệu gấu trúcDòng 6. Chúng tôi chuyển đổi dữ liệu thành DataFrame của gấu trúc có tên là dfdòng 8. Chúng tôi ghi df vào tệp Parquet bằng hàm to_parquet[]