So if the implementation effort difference is marginal, compatibility
issues can be handled with versioning, and vector columns are arguably a
niche type (limiting the blast radius), why would we consider a less
optimal approach? Are there other reasons we haven't discussed yet?

In either case we need to introduce a logical type, bringing us to about the
same time frame for changing the spec.

Rok

On Mon, Jul 6, 2026 at 3:08 PM Alkis Evlogimenos via dev <
[email protected]> wrote:

> 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