We have implemented Option C and the work is a couple of hundred lines of
code. I estimate the Option B will have about the same complexity. The
benefit of Option C is that we can ship it asap and we have no backward or
forward compatibility to think about.

On Mon, Jul 6, 2026 at 2:24 PM Antoine Pitrou <[email protected]> wrote:

>
> AFAICT, option C has the downside that a optional FIXED_SIZE_LIST would
> have a max definition level of 2, not 1. This can have significant
> effects on the performance of decoding definition levels.
>
> Also, option C is only a "small amount of work to implement" if you
> don't care about optimizing away the unnecessary processing of
> repetition levels. If you do, then it's not obvious that it would be
> less work to implement than option B.
>
> Regards
>
> Antoine.
>
>
> Le 01/07/2026 à 20:35, Andrew McCormick via dev a écrit :
> > Hi Rok,
> >
> > Just posted a comment to the doc but wanted to add it here, plus add a
> > little bit of extra info.
> >
> > Option C looks like by far the strongest option to me. Here's my take:
> >
> > Option A: not backwards compatible, poor encodings -- little upside.
> > Option B: clearly the path we'd take if we were designing a new format,
> but
> > for parquet as-is it would require a tremendous amount of work, and that
> > alone makes it untenable unless the gain it gives is way better than
> other
> > options.
> > Option C: Fully backwards compatible, keeps full encodings, small amount
> of
> > work to implement on readers and writers. The only downside is that we
> > still have to store the rep levels on disk (and load them), but due to
> the
> > fixed length arrays they compress to almost nothing under the RLE
> > encodings, so the cost is tiny.
> >
> > The extra info I wanted to add is that even for files without anything
> > added to them, you can in fact cheaply detect whether the array in
> question
> > is of a fixed size by doing some logic on the compressed rle data. On an
> > example dataset I benchmarked (100k rows of 4k-float array features) I
> > measured the decompression time to be 2.3x faster than our baseline
> reading
> > path. That verification does of course cost some time, and if we had the
> > hint from C in the data we could skip it, giving us another 1.5x.
> >
> > On Wed, Jul 1, 2026 at 11:24 AM Jiayi Wang <[email protected]> wrote:
> >
> >
> >
> >>
> >> ---------- Forwarded message ---------
> >> 发件人: Rok Mihevc <[email protected]>
> >> Date: 2026年6月29日周一 20:13
> >> Subject: Re: [DISCUSSION] Introduce FIXED_SIZE_LIST logical type
> >> To: <[email protected]>
> >> Cc: <[email protected]>
> >>
> >>
> >> Hi all,
> >>
> >> Based on benchmarks [1] comparing implementation variants, feedback
> >> received via
> >> the design doc [2] and in-person feedback I would like to move forward
> with
> >> the approach that introduces a new repetition type (Option B in the
> design
> >> doc and benchmarks) unless there are objections. Either here or on this
> >> week's community call would be a good venue to raise early objections
> >> or provide feedback on how to proceed.
> >>
> >> To show what a new repetition type would look like I've opened a
> >> parquet-format PR [3] and a draft Go implementation [4].
> >>
> >> [1] https://gist.github.com/rok/fe4785d4a74d2e080cbad73e88cc1bef
> >> [2]
> >>
> >>
> https://docs.google.com/document/d/1nf30OqK_UqxA4YTEZQszmOBEG56m9M5mp9rIYC2SUWc/edit?tab=t.0
> >> [3] https://github.com/apache/parquet-format/pull/592
> >> [4] https://github.com/apache/arrow-go/pull/854
> >>
> >> Rok
> >>
> >> On Sun, Jun 14, 2026 at 10:10 PM Rok Mihevc <[email protected]>
> wrote:
> >>
> >>> Hi all,
> >>>
> >>> A short update on the progress of this work. State of discussion can be
> >>> seen here [1].
> >>> I've created a set of naive C++ implementations of the discussed
> designs;
> >>> see here: https://gist.github.com/rok/fe4785d4a74d2e080cbad73e88cc1bef
> >>> Results should be taken with a grain of salt and more of a directional
> >>> rather than quantitative information.
> >>>
> >>> Personally I'm leaning towards option B because it is quite expressive
> >>> while still providing significant storage and writing performance
> >>> improvement.
> >>>
> >>> [1]
> >>>
> >>
> https://docs.google.com/document/d/1nf30OqK_UqxA4YTEZQszmOBEG56m9M5mp9rIYC2SUWc/edit?usp=sharing
> >>> [2] https://gist.github.com/rok/fe4785d4a74d2e080cbad73e88cc1bef -
> >>> benchmarks
> >>> [3] https://github.com/rok/arrow/pull/53 - option A
> >>> [4] https://github.com/rok/arrow/pull/51 - option B
> >>> [5] https://github.com/rok/arrow/pull/52 - option C
> >>>
> >>> Rok
> >>>
> >>> On Tue, May 5, 2026 at 3:21 PM Rok Mihevc <[email protected]>
> wrote:
> >>>
> >>>> Hi all,
> >>>>
> >>>> Picking this thread back up. I've put together a design doc outlining
> >>>> three options we've discussed:
> >>>>
> >>>>
> >>
> https://docs.google.com/document/d/1nf30OqK_UqxA4YTEZQszmOBEG56m9M5mp9rIYC2SUWc/edit?usp=sharing
> >>>>
> >>>> * Option A: logical type annotating FIXED_LEN_BYTE_ARRAY.
> >>>> * Option B: new VECTOR repetition type.
> >>>> * Option C: logical type annotating a normal LIST, where a recognizing
> >>>> reader skips rep-level decode and an unknown reader still sees a
> working
> >>>> LIST. A future revision would let writers omit rep-levels entirely.
> >>>>
> >>>> The document evaluates these against the same requirements and
> compares
> >>>> them along six axes (backwards compatibility, composability, encoding
> >>>> flexibility, implementation complexity, on-disk overhead, read
> >>>> performance). The doc aims to centralize the discussion and help us
> >> pick a
> >>>> direction.
> >>>> Comments are open. Most useful pushback would be on the requirements
> >>>> (especially the "no-fallback breaks adoption" one).
> >>>>
> >>>> Best,
> >>>> Rok
> >>>>
> >>>> On Tue, Mar 3, 2026 at 8:58 PM Antoine Pitrou <[email protected]>
> >> wrote:
> >>>>
> >>>>>
> >>>>> Hello,
> >>>>>
> >>>>> The downside with this approach is that the top-level "unit" type is
> >> not
> >>>>> the element type.
> >>>>>
> >>>>> For example, if you have a FIXED_SIZE_LIST(FLOAT32, 3), then the
> >>>>> top-level unit type is FIXED_LEN_BYTE_ARRAY(12). This means that
> >>>>> specialized encodings such as BYTE_STREAM_SPLIT, DELTA_BINARY_PACKED
> or
> >>>>> ALP may either be less efficient (for BYTE_STREAM_SPLIT) or not be
> >>>>> applicable at all (for the latter two).
> >>>>>
> >>>>> I wonder if we can find an approach that doesn't emit repetition
> levels
> >>>>> but still allows using efficient encodings for the element type.
> >>>>>
> >>>>> Regards
> >>>>>
> >>>>> Antoine.
> >>>>>
> >>>>>
> >>>>> Le 03/03/2026 à 01:13, Rok Mihevc a écrit :
> >>>>>> Hi all,
> >>>>>>
> >>>>>> I'd like to resurrect this thread in light of recent vectors in
> >> Parquet
> >>>>>> discussion [1].
> >>>>>> There is a (now updated) proposal PR from when the thread was
> started
> >>>>> that
> >>>>>> has a nice discussion [2].
> >>>>>>
> >>>>>> TLDR of the current proposal:
> >>>>>> - FIXED_SIZE_LIST annotates a FIXED_LEN_BYTE_ARRAY primitive leaf
> >> with
> >>>>>> FixedSizeListType { type, num_values }.
> >>>>>> - type must be fixed-width and non-array (INT32, INT64, FLOAT,
> >> DOUBLE,
> >>>>>> FIXED_LEN_BYTE_ARRAY); num_values > 0.
> >>>>>> - type_length must match num_values encoded with PLAIN
> representation
> >>>>> of
> >>>>>> type.
> >>>>>> - If the field is optional, the whole list value may be null;
> >> elements
> >>>>> are
> >>>>>> always non-null.
> >>>>>> - Intentionally not a `LIST` encoding (no def/rep levels).
> >>>>>> - Outer page/column encoding behavior is unchanged (any encoding
> >> valid
> >>>>> for
> >>>>>> `FIXED_LEN_BYTE_ARRAY` remains valid).
> >>>>>>
> >>>>>> I also added explicit validity requirements: writers must not emit
> >>>>>> violating metadata, and readers must treat violating metadata as
> >>>>> invalid.
> >>>>>>
> >>>>>>
> >>>>>> Rok
> >>>>>>
> >>>>>> [1]
> https://lists.apache.org/thread/nmq7odlbg1p6yx0hg00clzjbc3tb1tc3
> >>>>>> [2] https://github.com/apache/parquet-format/pull/241
> >>>>>>
> >>>>>> On Thu, May 16, 2024 at 4:34 AM Jan Finis <[email protected]>
> wrote:
> >>>>>>
> >>>>>>> I would love to see this!
> >>>>>>>
> >>>>>>> It is an important optimization for vectors, which become more and
> >>>>> more
> >>>>>>> important and ubiquitous for grounding of LLMs.
> >>>>>>>
> >>>>>>> Note however that the logical type route has one drawback: A
> logical
> >>>>> type
> >>>>>>> may not change the physical representation of values! Thus, if we
> >> make
> >>>>>>> FIXED_SIZE_LIST just a logical type, we would still need to write
> >>>>> R-Levels,
> >>>>>>> as even clients not knowing this logical type need to be able to
> >>>>> decode the
> >>>>>>> column. We could avoid reading the R-Levels and just assume that
> >> each
> >>>>> list
> >>>>>>> has the fixed size, so the read path would be optimized but the
> >> write
> >>>>> path
> >>>>>>> wouldn't.
> >>>>>>>
> >>>>>>> If we want to avoid writing R-Levels altogether, a logical type
> >>>>> doesn't cut
> >>>>>>> it. It needs to be something different. E.g., in the schema, we
> >> could
> >>>>> store
> >>>>>>> an optional `count` for repeated fields. Whenever this count is
> >>>>> present, we
> >>>>>>> would not write R-Levels for this field (or more precisely, this
> >> field
> >>>>>>> would not take part in the R-Level computation, as if it wasn't a
> >>>>> repeated
> >>>>>>> field). This of course is a more intrusive change, as legacy
> clients
> >>>>>>> couldn't read such columns anymore.
> >>>>>>>
> >>>>>>> I don't know which of the two alternatives is better. I agree with
> >>>>> Gang
> >>>>>>> that we should probably discuss this in a PR.
> >>>>>>>
> >>>>>>> Cheers,
> >>>>>>> Jan
> >>>>>>>
> >>>>>>>
> >>>>>>> Am Mi., 15. Mai 2024 um 14:03 Uhr schrieb Gang Wu <
> [email protected]
> >>> :
> >>>>>>>
> >>>>>>>> Hi Rok,
> >>>>>>>>
> >>>>>>>> Happy to see you here :)
> >>>>>>>>
> >>>>>>>> According to my past experience, it would be more helpful to open
> >>>>>>>> a PR against the parquet-format repository and post it here.
> >>>>>>>>
> >>>>>>>> Best,
> >>>>>>>> Gang
> >>>>>>>>
> >>>>>>>> On Wed, May 15, 2024 at 7:25 PM Rok Mihevc <[email protected]>
> >>>>> wrote:
> >>>>>>>>
> >>>>>>>>> Hi all,
> >>>>>>>>>
> >>>>>>>>> Arrow recently introduced FixedShapeTensor and
> VariableShapeTensor
> >>>>>>>>> canonical extension types [1] that use FixedSizeList and
> >>>>>>>> StructArray(List,
> >>>>>>>>> FixedSizeList) as storage respectfully. These are targeted at
> >>>>> machine
> >>>>>>>>> learning and scientific applications that deal with large
> datasets
> >>>>> and
> >>>>>>>>> would benefit from using Parquet as on disk storage.
> >>>>>>>>>
> >>>>>>>>> However currently FixedSizeList is stored as List in Parquet
> which
> >>>>> adds
> >>>>>>>>> significant conversion overhead when reading and writing [2]. It
> >>>>> would
> >>>>>>>>> therefore be beneficial to introduce a FIXED_SIZE_LIST logical
> >> type.
> >>>>>>>>>
> >>>>>>>>> I would like to open a discussion on potentially adding
> >>>>> FIXED_SIZE_LIST
> >>>>>>>>> type and prepare a proposal if discussion supports it.
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> Best,
> >>>>>>>>> Rok
> >>>>>>>>>
> >>>>>>>>> [1]
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>
> >>
> https://arrow.apache.org/docs/format/CanonicalExtensions.html#official-list
> >>>>>>>>> [2] https://github.com/apache/arrow/issues/34510
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>>
> >>
> >
>
>
>

Reply via email to