You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@iceberg.apache.org by "YuangGao (via GitHub)" <gi...@apache.org> on 2026/10/21 02:57:20 UTC

[I] write.parquet.page-row-limit has no effect: mapped to pyarrow's write_batch_size [iceberg-python]

YuangGao opened a new issue, #4126:
URL: https://github.com/apache/iceberg-python/issues/4126

   ### Apache Iceberg version
   
   main (development)
   
   ### Please describe the bug 🐞
   
   `write.parquet.page-row-limit` is mapped to pyarrow's `write_batch_size` ([pyarrow.py#L3002-L3006](https://github.com/apache/iceberg-python/blob/7d51e52bfd42dba2806979ee2554507e95fcfa0a/pyiceberg/io/pyarrow.py#L3002-L3006)), but `write_batch_size` is how many values pyarrow writes before checking the page size, not a per-page row limit. So the property has no effect.
   
   Two side effects:
   
   - The default of 20000 is always passed as `write_batch_size` (pyarrow's own default is 1024), so pages are size-checked far less often and can overshoot `write.parquet.page-size-bytes`.
   - Java maps this property to parquet-java's `withPageRowCountLimit`, so the same table writes differently from Java and PyIceberg.
   
   pyarrow 23.0.0 added `max_rows_per_page` (apache/arrow#48101), which is the actual per-page row limit.
   
   To reproduce, 50,000 int64 rows (column chunk size in bytes):
   
   ```python
   import pyarrow as pa
   import pyarrow.parquet as pq
   from pyiceberg.catalog.sql import SqlCatalog
   
   data = pa.table({"id": pa.array(range(50_000), pa.int64())})
   catalog = SqlCatalog("t", uri="sqlite:////tmp/cat.db", warehouse="file:///tmp/wh")
   catalog.create_namespace("ns")
   
   for name, props in [("a", {}), ("b", {"write.parquet.page-row-limit": "100"})]:
       table = catalog.create_table(f"ns.{name}", schema=data.schema, properties=props)
       table.append(data)
       path = next(iter(table.scan().plan_files())).file.file_path.removeprefix("file://")
       print(name, pq.ParquetFile(path).metadata.row_group(0).column(0).total_compressed_size)
   ```
   
   | | size |
   |---|---|
   | no properties | 145139 |
   | `write.parquet.page-row-limit=100` | 145139 (unchanged) |
   | pyarrow `max_rows_per_page=100`, for comparison | 181473 |
   
   Proposed fix: stop passing `write_batch_size`, and pass `max_rows_per_page` when pyarrow >= 23.0.0.
   
   ### Willingness to contribute
   
   - [x] I can contribute a fix for this bug independently
   - [ ] I would be willing to contribute a fix for this bug with guidance from the Iceberg community
   - [ ] I cannot contribute a fix for this bug at this time
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@iceberg.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@iceberg.apache.org
For additional commands, e-mail: issues-help@iceberg.apache.org


Re: [I] write.parquet.page-row-limit has no effect: mapped to pyarrow's write_batch_size [iceberg-python]

Posted by "Fokko (via GitHub)" <gi...@apache.org>.
Fokko closed issue #4126: write.parquet.page-row-limit has no effect: mapped to pyarrow's write_batch_size
URL: https://github.com/apache/iceberg-python/issues/4126


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@iceberg.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@iceberg.apache.org
For additional commands, e-mail: issues-help@iceberg.apache.org