diff --git a/python/datafusion/dataframe.py b/python/datafusion/dataframe.py index de00ff474..b4c55d21c 100644 --- a/python/datafusion/dataframe.py +++ b/python/datafusion/dataframe.py @@ -1558,7 +1558,7 @@ def write_parquet( if compression_level is not None: msg = "compression_level should be None when using ParquetWriterOptions" raise ValueError(msg) - self.write_parquet_with_options(path, compression) + self.write_parquet_with_options(path, compression, write_options) return if isinstance(compression, str): diff --git a/python/tests/test_dataframe.py b/python/tests/test_dataframe.py index bb21a3974..264b963b3 100644 --- a/python/tests/test_dataframe.py +++ b/python/tests/test_dataframe.py @@ -2504,6 +2504,25 @@ def test_write_parquet(df, tmp_path, path_to_str): assert result == expected +def test_write_parquet_writer_options_keeps_write_options(ctx, tmp_path): + """``write_parquet`` honours ``write_options`` alongside ``ParquetWriterOptions``. + + The ``ParquetWriterOptions`` branch delegates to + :py:meth:`DataFrame.write_parquet_with_options`, which takes ``write_options`` + too, so ``partition_by`` must still reach the writer. + """ + df = ctx.from_pydict({"part": ["a", "a", "b"], "v": [1, 2, 3]}) + path = tmp_path / "partitioned" + + df.write_parquet( + path, + ParquetWriterOptions(), + write_options=DataFrameWriteOptions(partition_by="part"), + ) + + assert sorted(p.name for p in path.iterdir()) == ["part=a", "part=b"] + + @pytest.mark.parametrize( ("compression", "compression_level"), [("gzip", 6), ("brotli", 7), ("zstd", 15)],