Skip to content

Commit 31da9d3

Browse files
committed
add python wrapper
1 parent e5f0d38 commit 31da9d3

5 files changed

Lines changed: 46 additions & 2 deletions

File tree

python/pyarrow/_dataset_parquet.pyx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ cdef class ParquetFileWriteOptions(FileWriteOptions):
620620
"coerce_timestamps",
621621
"allow_truncated_timestamps",
622622
"use_compliant_nested_type",
623+
"experimental_vector_encoding",
623624
}
624625

625626
setters = set()
@@ -676,6 +677,9 @@ cdef class ParquetFileWriteOptions(FileWriteOptions):
676677
writer_engine_version="V2",
677678
use_compliant_nested_type=(
678679
self._properties["use_compliant_nested_type"]
680+
),
681+
experimental_vector_encoding=(
682+
self._properties["experimental_vector_encoding"]
679683
)
680684
)
681685

@@ -705,6 +709,7 @@ cdef class ParquetFileWriteOptions(FileWriteOptions):
705709
coerce_timestamps=None,
706710
allow_truncated_timestamps=False,
707711
use_compliant_nested_type=True,
712+
experimental_vector_encoding=False,
708713
encryption_properties=None,
709714
write_batch_size=None,
710715
dictionary_pagesize_limit=None,

python/pyarrow/_parquet.pyx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2281,7 +2281,8 @@ cdef shared_ptr[ArrowWriterProperties] _create_arrow_writer_properties(
22812281
writer_engine_version=None,
22822282
use_compliant_nested_type=True,
22832283
store_schema=True,
2284-
write_time_adjusted_to_utc=False) except *:
2284+
write_time_adjusted_to_utc=False,
2285+
experimental_vector_encoding=False) except *:
22852286
"""Arrow writer properties"""
22862287
cdef:
22872288
shared_ptr[ArrowWriterProperties] arrow_properties
@@ -2322,6 +2323,11 @@ cdef shared_ptr[ArrowWriterProperties] _create_arrow_writer_properties(
23222323
else:
23232324
arrow_props.disable_compliant_nested_types()
23242325

2326+
# experimental_vector_encoding
2327+
2328+
if experimental_vector_encoding:
2329+
arrow_props.enable_experimental_vector_encoding()
2330+
23252331
# writer_engine_version
23262332

23272333
if writer_engine_version == "V1":
@@ -2396,7 +2402,8 @@ cdef class ParquetWriter(_Weakrefable):
23962402
store_decimal_as_integer=False,
23972403
use_content_defined_chunking=False,
23982404
write_time_adjusted_to_utc=False,
2399-
bloom_filter_options=None):
2405+
bloom_filter_options=None,
2406+
experimental_vector_encoding=False):
24002407
cdef:
24012408
shared_ptr[WriterProperties] properties
24022409
shared_ptr[ArrowWriterProperties] arrow_properties
@@ -2443,6 +2450,7 @@ cdef class ParquetWriter(_Weakrefable):
24432450
use_compliant_nested_type=use_compliant_nested_type,
24442451
store_schema=store_schema,
24452452
write_time_adjusted_to_utc=write_time_adjusted_to_utc,
2453+
experimental_vector_encoding=experimental_vector_encoding,
24462454
)
24472455

24482456
pool = maybe_unbox_memory_pool(memory_pool)

python/pyarrow/includes/libparquet.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ cdef extern from "parquet/api/writer.h" namespace "parquet" nogil:
528528
Builder* store_schema()
529529
Builder* enable_compliant_nested_types()
530530
Builder* disable_compliant_nested_types()
531+
Builder* enable_experimental_vector_encoding()
531532
Builder* set_engine_version(ArrowWriterEngineVersion version)
532533
Builder* set_time_adjusted_to_utc(c_bool adjusted)
533534
shared_ptr[ArrowWriterProperties] build()

python/pyarrow/parquet/core.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,10 @@ def _sanitize_table(table, new_schema, flavor):
876876
dictionary_pagesize_limit : int, default None
877877
Specify the dictionary page size limit per row group. If None, use the
878878
default 1MB.
879+
experimental_vector_encoding : bool, default False
880+
EXPERIMENTAL: Encode supported fixed-size list values, including the storage
881+
of fixed-shape tensor extension arrays, using Parquet VECTOR repetition.
882+
Unsupported fixed-size list values continue using standard LIST encoding.
879883
store_schema : bool, default True
880884
By default, the Arrow schema is serialized and stored in the Parquet
881885
file metadata (in the "ARROW:schema" key). When reading the file,
@@ -1083,6 +1087,7 @@ def __init__(self, where, schema, filesystem=None,
10831087
store_decimal_as_integer=False,
10841088
write_time_adjusted_to_utc=False,
10851089
max_rows_per_page=None,
1090+
experimental_vector_encoding=False,
10861091
**options):
10871092
if use_deprecated_int96_timestamps is None:
10881093
# Use int96 timestamps for Spark
@@ -1138,6 +1143,7 @@ def __init__(self, where, schema, filesystem=None,
11381143
store_decimal_as_integer=store_decimal_as_integer,
11391144
write_time_adjusted_to_utc=write_time_adjusted_to_utc,
11401145
max_rows_per_page=max_rows_per_page,
1146+
experimental_vector_encoding=experimental_vector_encoding,
11411147
**options)
11421148
self.is_open = True
11431149

@@ -2017,6 +2023,7 @@ def write_table(table, where, row_group_size=None, version='2.6',
20172023
write_time_adjusted_to_utc=False,
20182024
max_rows_per_page=None,
20192025
bloom_filter_options=None,
2026+
experimental_vector_encoding=False,
20202027
**kwargs):
20212028
# Implementor's note: when adding keywords here / updating defaults, also
20222029
# update it in write_to_dataset and _dataset_parquet.pyx ParquetFileWriteOptions
@@ -2051,6 +2058,7 @@ def write_table(table, where, row_group_size=None, version='2.6',
20512058
write_time_adjusted_to_utc=write_time_adjusted_to_utc,
20522059
max_rows_per_page=max_rows_per_page,
20532060
bloom_filter_options=bloom_filter_options,
2061+
experimental_vector_encoding=experimental_vector_encoding,
20542062
**kwargs) as writer:
20552063
writer.write_table(table, row_group_size=row_group_size)
20562064
except Exception:

python/pyarrow/tests/parquet/test_data_types.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,28 @@ def test_json_extension_type(storage_type):
581581
store_schema=False)
582582

583583

584+
def test_fixed_shape_tensor_vector_encoding():
585+
tensor_type = pa.fixed_shape_tensor(pa.float32(), [2, 3])
586+
storage = pa.array([
587+
[1, 2, 3, 4, 5, 6],
588+
None,
589+
[7, 8, 9, 10, 11, 12],
590+
], pa.list_(pa.float32(), 6))
591+
arr = pa.ExtensionArray.from_storage(tensor_type, storage)
592+
table = pa.table({"tensor": arr})
593+
594+
sink = pa.BufferOutputStream()
595+
pq.write_table(table, sink, experimental_vector_encoding=True)
596+
buf = sink.getvalue()
597+
598+
metadata = pq.read_metadata(pa.BufferReader(buf))
599+
assert "vector" in str(metadata.schema).lower()
600+
601+
result = pq.read_table(pa.BufferReader(buf))
602+
assert result.schema == table.schema
603+
assert result.equals(table)
604+
605+
584606
def test_uuid_extension_type():
585607
data = [
586608
b'\xe4`\xf9p\x83QGN\xac\x7f\xa4g>K\xa8\xcb',

0 commit comments

Comments
 (0)