Appendix BThe fixtures
Every experiment in the book runs on one of these files. Each was written by pyarrow, a production Parquet implementation, from a generator in the repository, so anyone can rebuild them and get the same bytes. The book’s reader never writes a fixture: it is tested against files it did not produce.
The rest of this page is generated by fixtures/generate.py from the same table that writes the
files.
Fixtures#
Generated by fixtures/generate.py. Do not edit this file or the fixtures by hand:
change the generator and run make fixtures. make check fails if a committed file
differs from what the generator writes.
Every fixture is written by pyarrow, a production Parquet implementation, and never by
this repository’s own code. The .json beside each file is pyarrow’s own description of
it, and the Rust tests use it as an oracle.
tiny.parquet#
The smallest useful file: four rows of a sales table, one row group, no compression, no dictionary, every column required so no levels are stored. Small enough to read completely by eye. The footer laboratory starts here.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 637 bytes |
| Rows | 4 |
| Row groups | 1 |
| Footer length | 380 bytes |
| SHA-256 | 67873fc1899b25ef… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsemultiple-row-groups.parquet#
The same sales schema split into row groups of two rows. The footer now describes several row groups, each with its own column chunks and statistics, so the structure view has more than one branch.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 1517 bytes |
| Rows | 6 |
| Row groups | 3 |
| Footer length | 902 bytes |
| SHA-256 | 31f67ae2363b4dd9… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=False
row_group_size=2types.parquet#
Three orders with a column for each physical type and the common logical types: a signed and an unsigned small integer, a decimal, a date, a UTC timestamp, a nullable string and an optional group. The same bytes mean different values depending on the logical type the schema gives them, which is ch03’s subject.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 1824 bytes |
| Rows | 3 |
| Row groups | 1 |
| Footer length | 1157 bytes |
| SHA-256 | 05a5b091422fda61… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
is_paid | BOOLEAN | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
quantity | INT32 | Int(bitWidth=8, isSigned=true) | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
store_id | INT32 | Int(bitWidth=16, isSigned=false) | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
weight_kg | FLOAT | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
amount | FIXED_LEN_BYTE_ARRAY | Decimal(precision=9, scale=2) | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
order_date | INT32 | Date | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
paid_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=microseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
shipping.city | BYTE_ARRAY | String | 2 | 0 | PLAIN, RLE | UNCOMPRESSED |
shipping.postcode | BYTE_ARRAY | String | 2 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsenested.parquet#
Four orders whose fields are missing in every way a nested value can be: a null string, a null list, an empty list, a list holding a null, and a list of structs each holding a list of its own. Every column stores repetition and definition levels, which is ch04’s subject.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 1191 bytes |
| Rows | 4 |
| Row groups | 1 |
| Footer length | 749 bytes |
| SHA-256 | 30bedb7fb46e30b6… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
email | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
tags.list.element | BYTE_ARRAY | String | 3 | 1 | PLAIN, RLE | UNCOMPRESSED |
items.list.element.sku | BYTE_ARRAY | String | 4 | 1 | PLAIN, RLE | UNCOMPRESSED |
items.list.element.discounts.list.element | INT32 | None | 6 | 2 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsedictionary.parquet#
Twelve orders written with dictionary encoding, the writer’s default. Each column chunk starts with a dictionary page of its distinct values, and its data page holds small indices into it, packed with the RLE / bit-packing hybrid.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 838 bytes |
| Rows | 12 |
| Row groups | 1 |
| Footer length | 415 bytes |
| SHA-256 | 087accb5d17576e2… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | UNCOMPRESSED |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=True
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falseencodings.parquet#
Forty orders with one column per encoding a writer uses instead of a dictionary: DELTA_BINARY_PACKED for increasing integers, DELTA_LENGTH_BYTE_ARRAY and DELTA_BYTE_ARRAY for strings, and BYTE_STREAM_SPLIT for floats. Each column’s values were chosen to suit its encoding.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 1558 bytes |
| Rows | 40 |
| Row groups | 1 |
| Footer length | 604 bytes |
| SHA-256 | 6a7aec2d72cd1b7c… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | DELTA_BINARY_PACKED, RLE | UNCOMPRESSED |
ordered_at | INT64 | None | 0 | 0 | DELTA_BINARY_PACKED, RLE | UNCOMPRESSED |
sku | BYTE_ARRAY | String | 0 | 0 | DELTA_LENGTH_BYTE_ARRAY, RLE | UNCOMPRESSED |
url | BYTE_ARRAY | String | 0 | 0 | DELTA_BYTE_ARRAY, RLE | UNCOMPRESSED |
weight_kg | FLOAT | None | 0 | 0 | BYTE_STREAM_SPLIT, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=False
column_encoding={'order_id': 'DELTA_BINARY_PACKED', 'ordered_at': 'DELTA_BINARY_PACKED', 'sku': 'DELTA_LENGTH_BYTE_ARRAY', 'url': 'DELTA_BYTE_ARRAY', 'weight_kg': 'BYTE_STREAM_SPLIT'}pages.parquet#
Sixty orders written in small pages, so every column chunk holds several data pages, and the country column has a dictionary page in front of them and nulls in them. Data page version 1.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 2102 bytes |
| Rows | 60 |
| Row groups | 1 |
| Footer length | 396 bytes |
| SHA-256 | ff3686c993b2a7d4… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE, RLE_DICTIONARY | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=['country']
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=False
data_page_size=128
write_batch_size=16pages-v2.parquet#
The same sixty orders in data page version 2, with a CRC-32 checksum in every page header. Compare its pages with pages.parquet’s: the levels move out of the compressible section and each header counts its rows and nulls.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 2223 bytes |
| Rows | 60 |
| Row groups | 1 |
| Footer length | 396 bytes |
| SHA-256 | 07c512f36c0dba3f… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE, RLE_DICTIONARY | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=['country']
write_statistics=True
store_schema=False
data_page_version='2.0'
write_page_index=False
data_page_size=128
write_batch_size=16
write_page_checksum=Truecodec-none.parquet#
256 orders, PLAIN-encoded with no dictionary and not compressed: the baseline the other codec-* files are measured against.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 15953 bytes |
| Rows | 256 |
| Row groups | 1 |
| Footer length | 806 bytes |
| SHA-256 | d53c6b99c3c150bd… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
sku | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
weight_kg | DOUBLE | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
distance_km | DOUBLE | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
note | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsecodec-snappy.parquet#
256 orders, PLAIN-encoded with no dictionary, compressed with snappy. The codec-* files hold identical pages before compression, so any difference in their sizes is the codec’s.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 6977 bytes |
| Rows | 256 |
| Row groups | 1 |
| Footer length | 802 bytes |
| SHA-256 | abc55ee0a7e3422f… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | SNAPPY |
sku | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | SNAPPY |
weight_kg | DOUBLE | None | 0 | 0 | PLAIN, RLE | SNAPPY |
distance_km | DOUBLE | None | 0 | 0 | PLAIN, RLE | SNAPPY |
note | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsecodec-gzip.parquet#
256 orders, PLAIN-encoded with no dictionary, compressed with gzip. The codec-* files hold identical pages before compression, so any difference in their sizes is the codec’s.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 5052 bytes |
| Rows | 256 |
| Row groups | 1 |
| Footer length | 802 bytes |
| SHA-256 | 3e1f661b4783d749… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | GZIP |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | GZIP |
sku | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | GZIP |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | GZIP |
weight_kg | DOUBLE | None | 0 | 0 | PLAIN, RLE | GZIP |
distance_km | DOUBLE | None | 0 | 0 | PLAIN, RLE | GZIP |
note | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | GZIP |
Writer options:
compression='gzip'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsecodec-lz4.parquet#
256 orders, PLAIN-encoded with no dictionary, compressed with lz4. The codec-* files hold identical pages before compression, so any difference in their sizes is the codec’s.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 6641 bytes |
| Rows | 256 |
| Row groups | 1 |
| Footer length | 802 bytes |
| SHA-256 | 1bd91f635d0101e5… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | LZ4 |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | LZ4 |
sku | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | LZ4 |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | LZ4 |
weight_kg | DOUBLE | None | 0 | 0 | PLAIN, RLE | LZ4 |
distance_km | DOUBLE | None | 0 | 0 | PLAIN, RLE | LZ4 |
note | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | LZ4 |
Writer options:
compression='lz4'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsecodec-zstd.parquet#
256 orders, PLAIN-encoded with no dictionary, compressed with zstd. The codec-* files hold identical pages before compression, so any difference in their sizes is the codec’s.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 5060 bytes |
| Rows | 256 |
| Row groups | 1 |
| Footer length | 802 bytes |
| SHA-256 | f9d0f560ca99b6bd… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | ZSTD |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | ZSTD |
sku | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | ZSTD |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | ZSTD |
weight_kg | DOUBLE | None | 0 | 0 | PLAIN, RLE | ZSTD |
distance_km | DOUBLE | None | 0 | 0 | PLAIN, RLE | ZSTD |
note | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | ZSTD |
Writer options:
compression='zstd'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsecodec-brotli.parquet#
256 orders, PLAIN-encoded with no dictionary, compressed with brotli. The codec-* files hold identical pages before compression, so any difference in their sizes is the codec’s.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 4513 bytes |
| Rows | 256 |
| Row groups | 1 |
| Footer length | 801 bytes |
| SHA-256 | 32545187a00721f9… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | BROTLI |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | BROTLI |
sku | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | BROTLI |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | BROTLI |
weight_kg | DOUBLE | None | 0 | 0 | PLAIN, RLE | BROTLI |
distance_km | DOUBLE | None | 0 | 0 | PLAIN, RLE | BROTLI |
note | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | BROTLI |
Writer options:
compression='brotli'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsestatistics.parquet#
Twelve orders in three row groups, with a column for each way a reader can misread statistics: unsigned integers above 2^31, negative small integers, strings with non-ASCII bytes, floats with NaN and signed zeros, negative decimals, a column that is null throughout one row group, and a column written without statistics. The row groups declare that they are sorted by order_id.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 3911 bytes |
| Rows | 12 |
| Row groups | 3 |
| Footer length | 2139 bytes |
| SHA-256 | 5954be0a5dbc9bf1… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
customer_id | INT32 | Int(bitWidth=32, isSigned=false) | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
delta | INT32 | Int(bitWidth=8, isSigned=true) | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
city | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
temp_c | DOUBLE | None | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
amount | FIXED_LEN_BYTE_ARRAY | Decimal(precision=9, scale=2) | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
coupon | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
note | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=['order_id', 'customer_id', 'delta', 'city', 'temp_c', 'amount', 'coupon']
store_schema=False
data_page_version='1.0'
write_page_index=False
row_group_size=4
sorting_columns=[{'column_index': 0, 'descending': False, 'nulls_first': False}]pruning-sorted.parquet#
800 orders written in order_id order: four row groups of 200, pages of 40 rows, a page index for every column, and a Bloom filter for customer_id. Because the rows are sorted, each row group and page covers a narrow range of order_id, and a reader can skip most of the file for a query on it.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 26926 bytes |
| Rows | 800 |
| Row groups | 4 |
| Footer length | 1892 bytes |
| SHA-256 | 007f6565c1518742… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE, RLE_DICTIONARY | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=['country']
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=200
max_rows_per_page=40
bloom_filter_options={'customer_id': {'ndv': 200, 'fpp': 0.05}}pruning-shuffled.parquet#
The same 800 orders as pruning-sorted.parquet, shuffled, and written the same way. Every row group and page now covers nearly the whole range of order_id, and the statistics can rule out almost nothing.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 26895 bytes |
| Rows | 800 |
| Row groups | 4 |
| Footer length | 1892 bytes |
| SHA-256 | 906bc2255f0439c6… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE, RLE_DICTIONARY | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=['country']
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=200
max_rows_per_page=40
bloom_filter_options={'customer_id': {'ndv': 200, 'fpp': 0.05}}writing-baseline.parquet#
800 orders in order_id order, written the way ch11 starts from: Snappy, dictionary encoding, four row groups of 200, pages of 40 rows, and a page index. Every other writing-* file changes one of these.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 28779 bytes |
| Rows | 800 |
| Row groups | 4 |
| Footer length | 2935 bytes |
| SHA-256 | 62e6ffef5da3611b… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
ordered_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
status | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=True
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=200
max_rows_per_page=40writing-one-group.parquet#
writing-baseline.parquet in one row group of 800 rows.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 26339 bytes |
| Rows | 800 |
| Row groups | 1 |
| Footer length | 889 bytes |
| SHA-256 | 02973f9b4bf9bc24… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
ordered_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
status | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=True
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=800
max_rows_per_page=40writing-small-groups.parquet#
writing-baseline.parquet in row groups of 40 rows: twenty row groups, each with its own column chunks, statistics and page index.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 44190 bytes |
| Rows | 800 |
| Row groups | 20 |
| Footer length | 13648 bytes |
| SHA-256 | 2746a47c6997008b… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
ordered_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
status | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=True
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=40
max_rows_per_page=40writing-by-country.parquet#
writing-baseline.parquet’s rows sorted by country, then order_id.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 28430 bytes |
| Rows | 800 |
| Row groups | 4 |
| Footer length | 2935 bytes |
| SHA-256 | d6f68b80f3ab65b8… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
ordered_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
status | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=True
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=200
max_rows_per_page=40writing-shuffled.parquet#
writing-baseline.parquet’s rows in a pseudo-random order.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 28740 bytes |
| Rows | 800 |
| Row groups | 4 |
| Footer length | 2935 bytes |
| SHA-256 | 56aee95056cb7f35… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
ordered_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
status | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=True
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=200
max_rows_per_page=40writing-plain.parquet#
writing-baseline.parquet without dictionary encoding.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 28910 bytes |
| Rows | 800 |
| Row groups | 4 |
| Footer length | 2665 bytes |
| SHA-256 | 82221f0512144758… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | SNAPPY |
ordered_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE | SNAPPY |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | SNAPPY |
status | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=True
row_group_size=200
max_rows_per_page=40writing-no-index.parquet#
writing-baseline.parquet without a page index. pyarrow then writes each page’s statistics into its page header instead.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 29253 bytes |
| Rows | 800 |
| Row groups | 4 |
| Footer length | 2633 bytes |
| SHA-256 | a1d69a275b01b231… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
ordered_at | INT64 | Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, is_from_converted_type=false, force_set_converted_type=false) | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
customer_id | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
status | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=True
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=False
row_group_size=200
max_rows_per_page=40encrypted-footer.parquet#
Twelve orders with modular encryption and an encrypted footer: the file ends in PARE. email is encrypted with the pii key and amount_cents with the finance key; order_id and country are not encrypted, but the footer that would say where they are is. Written once, since encryption is never byte-for-byte reproducible; the check decrypts it with the published test keys.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 2123 bytes |
| Rows | 12 |
| Row groups | 1 |
| Footer length | 954 bytes |
| SHA-256 | 0ab7d6a98676365f… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
email | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falseplaintext-footer.parquet#
The same orders and keys with a plaintext footer: the file ends in PAR1, the footer is readable and signed, and only the two encrypted columns’ pages and details are hidden.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 2192 bytes |
| Rows | 12 |
| Row groups | 1 |
| Footer length | 1222 bytes |
| SHA-256 | 9a58c765f5254a27… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
email | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | UNCOMPRESSED |
Writer options:
compression='none'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=Falsepages-v2-snappy.parquet#
pages-v2.parquet compressed with Snappy. In data page version 2 only a page’s values are compressed: its levels stay as they were, so a reader can count rows and nulls without decompressing anything.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 1854 bytes |
| Rows | 60 |
| Row groups | 1 |
| Footer length | 396 bytes |
| SHA-256 | 46e6c748a90443af… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | SNAPPY |
country | BYTE_ARRAY | String | 1 | 0 | PLAIN, RLE, RLE_DICTIONARY | SNAPPY |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | SNAPPY |
Writer options:
compression='snappy'
use_dictionary=['country']
write_statistics=True
store_schema=False
data_page_version='2.0'
write_page_index=False
data_page_size=128
write_batch_size=16
write_page_checksum=Truecodec-zstd-split.parquet#
codec-zstd.parquet with its two float columns written BYTE_STREAM_SPLIT. Comparing the two files measures what splitting a float’s bytes is worth to a compressor, for decimal-looking floats and for noisy ones.
| Written by | pyarrow 25.0.1 (fixtures/generate.py) |
| Size | 5360 bytes |
| Rows | 256 |
| Row groups | 1 |
| Footer length | 802 bytes |
| SHA-256 | b916da53758901c3… |
Leaf columns, as pyarrow reads the Parquet schema:
| Column | Physical type | Logical type | Max def | Max rep | Encodings | Codec |
|---|---|---|---|---|---|---|
order_id | INT64 | None | 0 | 0 | PLAIN, RLE | ZSTD |
country | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | ZSTD |
sku | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | ZSTD |
amount_cents | INT64 | None | 0 | 0 | PLAIN, RLE | ZSTD |
weight_kg | DOUBLE | None | 0 | 0 | BYTE_STREAM_SPLIT, RLE | ZSTD |
distance_km | DOUBLE | None | 0 | 0 | BYTE_STREAM_SPLIT, RLE | ZSTD |
note | BYTE_ARRAY | String | 0 | 0 | PLAIN, RLE | ZSTD |
Writer options:
compression='zstd'
use_dictionary=False
write_statistics=True
store_schema=False
data_page_version='1.0'
write_page_index=False
column_encoding={'weight_kg': 'BYTE_STREAM_SPLIT', 'distance_km': 'BYTE_STREAM_SPLIT'}Built from commit c32f48e.