Skip to content

Commit d8b8052

Browse files
committed
Add optional Parquet page index writes
1 parent 1d4f8d3 commit d8b8052

5 files changed

Lines changed: 16 additions & 0 deletions

File tree

‎mkdocs/docs/configuration.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ Iceberg tables support table properties to configure table behavior.
8484
| `write.parquet.row-group-limit` | Number of rows | 1048576 | The upper bound of the number of entries within a single row group |
8585
| `write.parquet.page-size-bytes` | Size in bytes | 1MB | Set a target threshold for the approximate encoded size of data pages within a column chunk |
8686
| `write.parquet.page-row-limit` | Number of rows | 20000 | Set a target threshold for the maximum number of rows within a column chunk |
87+
| `write.parquet.page-index-enabled` | Boolean | false | Write Parquet column and offset indexes for page-level filtering |
8788
| `write.parquet.dict-size-bytes` | Size in bytes | 2MB | Set the dictionary page size limit per row group |
8889
| `write.metadata.previous-versions-max` | Integer | 100 | The max number of previous version metadata files to keep before deleting after commit. |
8990
| `write.metadata.delete-after-commit.enabled` | Boolean | False | Whether to automatically delete old *tracked* metadata files after each table commit. It will retain a number of the most recent metadata files, which can be set using property `write.metadata.previous-versions-max`. |

‎pyiceberg/io/pyarrow.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2957,6 +2957,11 @@ def _get_parquet_writer_kwargs(table_properties: Properties) -> dict[str, Any]:
29572957
property_name=TableProperties.PARQUET_PAGE_ROW_LIMIT,
29582958
default=TableProperties.PARQUET_PAGE_ROW_LIMIT_DEFAULT,
29592959
),
2960+
"write_page_index": property_as_bool(
2961+
properties=table_properties,
2962+
property_name=TableProperties.PARQUET_PAGE_INDEX_ENABLED,
2963+
default=TableProperties.PARQUET_PAGE_INDEX_ENABLED_DEFAULT,
2964+
),
29602965
}
29612966

29622967

‎pyiceberg/table/__init__.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ class TableProperties:
147147
PARQUET_PAGE_ROW_LIMIT = "write.parquet.page-row-limit"
148148
PARQUET_PAGE_ROW_LIMIT_DEFAULT = 20000
149149

150+
PARQUET_PAGE_INDEX_ENABLED = "write.parquet.page-index-enabled"
151+
PARQUET_PAGE_INDEX_ENABLED_DEFAULT = False
152+
150153
PARQUET_DICT_SIZE_BYTES = "write.parquet.dict-size-bytes"
151154
PARQUET_DICT_SIZE_BYTES_DEFAULT = 2 * 1024 * 1024 # 2 MB
152155

‎tests/integration/test_writes/test_writes.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ def test_write_parquet_compression_properties(
669669
[
670670
({"write.parquet.page-size-bytes": "42"}, {"data_page_size": 42}),
671671
({"write.parquet.dict-size-bytes": "42"}, {"dictionary_pagesize_limit": 42}),
672+
({"write.parquet.page-index-enabled": "true"}, {"write_page_index": True}),
672673
],
673674
)
674675
def test_write_parquet_other_properties(

‎tests/io/test_pyarrow.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
_check_pyarrow_schema_compatible,
7575
_ConvertToArrowSchema,
7676
_determine_partitions,
77+
_get_parquet_writer_kwargs,
7778
_primitive_to_physical,
7879
_read_deletes,
7980
_task_to_record_batches,
@@ -127,6 +128,11 @@
127128
)
128129

129130

131+
def test_parquet_page_index_writer_property() -> None:
132+
assert _get_parquet_writer_kwargs({})["write_page_index"] is False
133+
assert _get_parquet_writer_kwargs({"write.parquet.page-index-enabled": "true"})["write_page_index"] is True
134+
135+
130136
def test_pyarrow_infer_local_fs_from_path() -> None:
131137
"""Test path with `file` scheme and no scheme both use LocalFileSystem"""
132138
assert isinstance(PyArrowFileIO().new_output("file://tmp/warehouse")._filesystem, LocalFileSystem)

0 commit comments

Comments
 (0)