The benefit of having a memory format that’s friendly to non-deterministic
order writes is unlocked by the transport and processing of the data being
agnostic to the physical order as much as possible.

Requiring a conversion could cancel out that benefit. But it can be a
provisory step for compatibility between systems that don’t understand the
format yet. This is similar to the situation with compression schemes like
run-end encoding — the goal is processing the compressed data directly
without an expansion step whenever possible.

This is why having it as part of the open Arrow format is so important:
everyone can agree on a format that’s friendly to parallel and/or
vectorized compute kernels without introducing multiple incompatible
formats to the ecosystem and without imposing a conversion step between the
different systems.

—
Felipe

On Sat, 20 May 2023 at 20:04 Aldrin <octalene....@pm.me.invalid> wrote:

> I don't feel like this representation is necessarily a detail of the query
> engine, but I am also not sure why this representation would have to be
> converted to a non-view format when serializing. Could you clarify that? My
> impression is that this representation could be used for persistence or
> data transfer, though it can be more complex to guarantee the portion of
> the buffer that an index points to is also present in memory.
>
> Sent from Proton Mail for iOS
>
>
> On Sat, May 20, 2023 at 15:00, Sasha Krassovsky <krassovskysa...@gmail.com
> <On+Sat,+May+20,+2023+at+15:00,+Sasha+Krassovsky+%3C%3Ca+href=>> wrote:
>
> Hi everyone,
> I understand that there are numerous benefits to this representation
> during query processing, but would it be fair to say that this is an
> implementation detail of the query engine? Query engines don’t necessarily
> need to conform to the Arrow format internally, only at ingest/egress
> points, and performing a conversion from the non-view to view format seems
> like it would be very cheap (though I understand not necessarily the other
> way around, but you’d need to do that anyway if you’re serializing).
>
> Sasha Krassovsky
>
> > 20 мая 2023 г., в 13:00, Will Jones <will.jones...@gmail.com>
> написал(а):
> >
> > Thanks for sharing these details, Pedro. The conditional branches
> argument
> > makes a lot of sense to me.
> >
> > The tensors point brings up some interesting issues. For now, we've
> defined
> > our only tensor extension type to be built on a fixed size list. If a use
> > case of this might be manipulating tensors with zero copy, perhaps that
> > suggests that we want a fixed size list variant? In addition, would we
> have
> > to define another extension type to be a ListView variant? Or would we
> want
> > to think about making extension types somehow valid across various
> > encodings of the same "logical type"?
> >
> >> On Fri, May 19, 2023 at 1:59 PM Pedro Eugenio Rocha Pedreira
> >> <pedro...@meta.com.invalid> wrote:
> >>
> >> Hi all,
> >>
> >> This is Pedro from the Velox team at Meta. This is my first time here,
> so
> >> nice to e-meet you!
> >>
> >> Adding to what Felipe said, the main reason we created “ListView”
> (though
> >> we just call them ArrayVector/MapVector in Velox) is that, along with
> >> StringViews for strings, they allow us to write any columnar buffer
> >> out-or-order, regardless of their types or encodings. This is naturally
> >> doable for all primitive types (fixed-size), but not for types that
> don’t
> >> have fixed size and are required to be contiguous. The StringView and
> >> ListView formats allow us to keep this invariant in Velox.
> >>
> >> Being able to write vectors out-of-order is useful when executing
> >> conditionals like IF/SWITCH statements, which are pervasive among our
> >> workloads. To fully vectorize it, one first evaluates the expression,
> then
> >> generate a bitmap containing which rows take the THEN and which take the
> >> ELSE branch. Then you populate all rows that match the first branch by
> >> evaluating the THEN expression in a vectorized (branch-less and cache
> >> friendly) way, and subsequently the ELSE branch. If you can’t write them
> >> out-of-order, you would either have a big branch per row dispatching to
> the
> >> right expression (slow), or populate two distinct vectors then merging
> them
> >> at the end (potentially even slower). How much faster our approach is
> >> highly depends on the buffer sizes and expressions, but we found it to
> be
> >> faster enough on average to justify us extending the underlying layout.
> >>
> >> With that said, this is all within a single thread of execution.
> >> Parallelization is done by feeding each thread its own vector/data. As
> >> pointed out in a previous message, this also gives you the flexibility
> to
> >> implement cardinality increasing/reducing operations, but we don’t use
> it
> >> for that purpose. Operations like filtering, joining, unnesting and
> similar
> >> are done by wrapping the internal vector in a dictionary, as these need
> to
> >> work not only on “ListViews” but on any data types with any encoding.
> There
> >> are more details on Section 4.2.1 in [1]
> >>
> >> Beyond this, it also gives function/kernel developers more flexibility
> to
> >> implement operations that manipulate Arrays/Maps. For example,
> operations
> >> that slice these containers can be implemented in a zero-copy manner by
> >> just rearranging the lengths/offsets indices, without ever touching the
> >> larger internal buffers. This is a similar motivation as for StringView
> >> (think of substr(), trim(), and similar). One nice last property is that
> >> this layout allows for overlapping ranges. This is something discussed
> with
> >> our ML people to allow deduping feature values in a tensor (which is
> fairly
> >> common), but not something we have leveraged just yet.
> >>
> >> [1] - https://vldb.org/pvldb/vol15/p3372-pedreira.pdf
> >>
> >> Best,
> >> --
> >> Pedro Pedreira
> >> ________________________________
> >> From: Felipe Oliveira Carvalho <felipe...@gmail.com>
> >> Sent: Friday, May 19, 2023 10:01 AM
> >> To: dev@arrow.apache.org <dev@arrow.apache.org>
> >> Cc: Pedro Eugenio Rocha Pedreira <pedro...@meta.com>
> >> Subject: Re: [DISCUSS][Format] Starting the draft implementation of the
> >> ArrayView array format
> >>
> >> +pedroerp On Thu, 11 May 2023 at 17: 51 Raphael Taylor-Davies <r.
> >> taylordavies@ googlemail. com. invalid> wrote: Hi All, > if we added
> >> this, do we think many Arrow and query > engine implementations (for
> >> example, DataFusion) will be
> >> ZjQcmQRYFpfptBannerStart
> >> This Message Is From an External Sender
> >>
> >> ZjQcmQRYFpfptBannerEnd
> >> +pedroerp
> >>
> >> On Thu, 11 May 2023 at 17:51 Raphael Taylor-Davies
> >> <r.taylordav...@googlemail.com.invalid> wrote:
> >> Hi All,
> >>
> >>> if we added this, do we think many Arrow and query
> >>> engine implementations (for example, DataFusion) will be eager to add
> >> full
> >>> support for the type, including compute kernels? Or are they likely to
> >> just
> >>> convert this type to ListArray at import boundaries?
> >> I can't speak for query engines in general, but at least for arrow-rs
> >> and by extension DataFusion, and based on my current understanding of
> >> the use-cases I would be rather hesitant to add support to the kernels
> >> for this array type, definitely instead favouring conversion at the
> >> edges. We already have issues with the amount of code generation
> >> resulting in binary bloat and long compile times, and I worry this would
> >> worsen this situation whilst not really providing compelling advantages
> >> for the vast majority of workloads that don't interact with Velox.
> >> Whilst I can definitely see that the ListView representation is probably
> >> a better way to represent variable length lists than what arrow settled
> >> upon, I'm not yet convinced it is sufficiently better to incentivise
> >> broad ecosystem adoption.
> >>
> >> Kind Regards,
> >>
> >> Raphael Taylor-Davies
> >>
> >>> On 11/05/2023 21:20, Will Jones wrote:
> >>> Hi Felipe,
> >>>
> >>> Thanks for the additional details.
> >>>
> >>>
> >>>> Velox kernels benefit from being able to append data to the array from
> >>>> different threads without care for strict ordering. Only the offsets
> >> array
> >>>> has to be written according to logical order but that is potentially a
> >> much
> >>>> smaller buffer than the values buffer.
> >>>>
> >>> It still seems to me like applications are still pretty niche, as I
> >> suspect
> >>> in most cases the benefits are outweighed by the costs. The benefit
> here
> >>> seems pretty limited: if you are trying to split work between threads,
> >>> usually you will have other levels such as array chunks to parallelize.
> >> And
> >>> if you have an incoming stream of row data, you'll want to append in
> >>> predictable order to match the order of the other arrays. Am I missing
> >>> something?
> >>>
> >>> And, IIUC, the cost of using ListView with out-of-order values over
> >>> ListArray is you lose memory locality; the values of element 2 are no
> >>> longer adjacent to the values of element 1. What do you think about
> that
> >>> tradeoff?
> >>>
> >>> I don't mean to be difficult about this. I'm excited for both the REE
> and
> >>> StringView arrays, but this one I'm not so sure about yet. I suppose
> >> what I
> >>> am trying to ask is, if we added this, do we think many Arrow and query
> >>> engine implementations (for example, DataFusion) will be eager to add
> >> full
> >>> support for the type, including compute kernels? Or are they likely to
> >> just
> >>> convert this type to ListArray at import boundaries?
> >>>
> >>> Because if it turns out to be the latter, then we might as well ask
> Velox
> >>> to export this type as ListArray and save the rest of the ecosystem
> some
> >>> work.
> >>>
> >>> Best,
> >>>
> >>> Will Jones
> >>>
> >>> On Thu, May 11, 2023 at 12:32 PM Felipe Oliveira Carvalho <
> >>> felipe...@gmail.com<mailto:felipe...@gmail.com>> wrote:
> >>>
> >>>> Initial reason for ListView arrays in Arrow is zero-copy compatibility
> >> with
> >>>> Velox which uses this format.
> >>>>
> >>>> Velox kernels benefit from being able to append data to the array from
> >>>> different threads without care for strict ordering. Only the offsets
> >> array
> >>>> has to be written according to logical order but that is potentially a
> >> much
> >>>> smaller buffer than the values buffer.
> >>>>
> >>>> Acero kernels could take advantage of that in the future.
> >>>>
> >>>> In implementing ListViewArray/Type I was able to reuse some C++
> >> templates
> >>>> used for ListArray which can reduce some of the burden on kernel
> >>>> implementations that aim to work with all the types.
> >>>>
> >>>> I’m can fix Acero kernels for working with ListView. This is similar
> to
> >> the
> >>>> work I’ve doing in kernels dealing with run-end encoded arrays.
> >>>>
> >>>> —
> >>>> Felipe
> >>>>
> >>>>
> >>>> On Wed, 26 Apr 2023 at 01:03 Will Jones <will.jones...@gmail.com
> >> <mailto:will.jones...@gmail.com>> wrote:
> >>>>
> >>>>> I suppose one common use case is materializing list columns after
> some
> >>>>> expanding operation like a join or unnest. That's a case where I
> could
> >>>>> imagine a lot of repetition of values. Haven't yet thought of common
> >>>> cases
> >>>>> where there is overlap but not full duplication, but am eager to hear
> >>>> any.
> >>>>> The dictionary encoding point Raphael makes is interesting,
> especially
> >>>>> given the existence of LargeList and FixedSizeList. For many
> >> operations,
> >>>> it
> >>>>> might make more sense to just compose those existing types.
> >>>>>
> >>>>> IIUC the operations that would be unique to the ArrayView are ones
> >>>> altering
> >>>>> the shape. One could truncate each array to a certain length cheaply
> >>>> simply
> >>>>> by replacing the sizes buffer. Or perhaps there are interesting
> >>>> operations
> >>>>> on tensors that would benefit.
> >>>>>
> >>>>> On Tue, Apr 25, 2023 at 7:47 PM Raphael Taylor-Davies
> >>>>> <r.taylordav...@googlemail.com.invalid> wrote:
> >>>>>
> >>>>>> Unless I am missing something, I think the selection use-case could
> be
> >>>>>> equally well served by a dictionary-encoded BinarArray/ListArray,
> and
> >>>>> would
> >>>>>> have the benefit of not requiring any modifications to the existing
> >>>>> format
> >>>>>> or kernels.
> >>>>>>
> >>>>>> The major additional flexibility of the proposed encoding would be
> >>>>>> permitting disjoint or overlapping ranges, are these common enough
> in
> >>>>>> practice to represent a meaningful bottleneck?
> >>>>>>
> >>>>>>
> >>>>>> On 26 April 2023 01:40:14 BST, David Li <lidav...@apache.org
> <mailto:
> >> lidav...@apache.org>> wrote:
> >>>>>>> Is there a need for a 64-bit offsets version the same way we have
> >> List
> >>>>>> and LargeList?
> >>>>>>> And just to be clear, the difference with List is that the lists
> >> don't
> >>>>>> have to be stored in their logical order (or in other words, offsets
> >> do
> >>>>> not
> >>>>>> have to be nondecreasing and so we also need sizes)?
> >>>>>>> On Wed, Apr 26, 2023, at 09:37, Weston Pace wrote:
> >>>>>>>> For context, there was some discussion on this back in [1]. At
> that
> >>>>>> time
> >>>>>>>> this was called "sequence view" but I do not like that name.
> >>>> However,
> >>>>>>>> array-view array is a little confusing. Given this is similar to
> >>>> list
> >>>>>> can
> >>>>>>>> we go with list-view array?
> >>>>>>>>
> >>>>>>>>> Thanks for the introduction. I'd be interested to hear about the
> >>>>>>>>> applications Velox has found for these vectors, and in what
> >>>>> situations
> >>>>>>>> they
> >>>>>>>>> are useful. This could be contrasted with the current ListArray
> >>>>>>>>> implementations.
> >>>>>>>> I believe one significant benefit is that take (and by proxy,
> >>>> filter)
> >>>>>> and
> >>>>>>>> sort are O(# of items) with the proposed format and O(# of bytes)
> >>>> with
> >>>>>> the
> >>>>>>>> current format. Jorge did some profiling to this effect in [1].
> >>>>>>>>
> >>>>>>>> [1]
> >>>> https://lists.apache.org/thread/49qzofswg1r5z7zh39pjvd1m2ggz2kdq<
> >> https://lists.apache.org/thread/49qzofswg1r5z7zh39pjvd1m2ggz2kdq>
> >>>>>>>> On Tue, Apr 25, 2023 at 3:13 PM Will Jones <
> will.jones...@gmail.com
> >> <mailto:will.jones...@gmail.com>
> >>>>>> wrote:
> >>>>>>>>> Hi Felipe,
> >>>>>>>>>
> >>>>>>>>> Thanks for the introduction. I'd be interested to hear about the
> >>>>>>>>> applications Velox has found for these vectors, and in what
> >>>>> situations
> >>>>>> they
> >>>>>>>>> are useful. This could be contrasted with the current ListArray
> >>>>>>>>> implementations.
> >>>>>>>>>
> >>>>>>>>> IIUC it would be fairly cheap to transform a ListArray to an
> >>>>>> ArrayView, but
> >>>>>>>>> expensive to go the other way.
> >>>>>>>>>
> >>>>>>>>> Best,
> >>>>>>>>>
> >>>>>>>>> Will Jones
> >>>>>>>>>
> >>>>>>>>> On Tue, Apr 25, 2023 at 3:00 PM Felipe Oliveira Carvalho <
> >>>>>>>>> felipe...@gmail.com<mailto:felipe...@gmail.com>> wrote:
> >>>>>>>>>
> >>>>>>>>>> Hi folks,
> >>>>>>>>>>
> >>>>>>>>>> I would like to start a public discussion on the inclusion of a
> >>>> new
> >>>>>> array
> >>>>>>>>>> format to Arrow — array-view array. The name is also up for
> >>>> debate.
> >>>>>>>>>> This format is inspired by Velox's ArrayVector format [1].
> >>>>> Logically,
> >>>>>>>>> this
> >>>>>>>>>> array represents an array of arrays. Each element is an
> >>>> array-view
> >>>>>>>>> (offset
> >>>>>>>>>> and size pair) that points to a range within a nested "values"
> >>>>> array
> >>>>>>>>>> (called "elements" in Velox docs). The nested array can be of
> any
> >>>>>> type,
> >>>>>>>>>> which makes this format very flexible and powerful.
> >>>>>>>>>>
> >>>>>>>>>> [image: ../_images/array-vector.png]
> >>>>>>>>>> <
> >>>>> https://facebookincubator.github.io/velox/_images/array-vector.png<
> >> https://facebookincubator.github.io/velox/_images/array-vector.png>>
> >>>>>>>>>> I'm currently working on a C++ implementation and plan to work
> >>>> on a
> >>>>>> Go
> >>>>>>>>>> implementation to fulfill the two-implementations requirement
> for
> >>>>>> format
> >>>>>>>>>> changes.
> >>>>>>>>>>
> >>>>>>>>>> The draft design:
> >>>>>>>>>>
> >>>>>>>>>> - 3 buffers: [validity_bitmap, int32 offsets buffer, int32 sizes
> >>>>>> buffer]
> >>>>>>>>>> - 1 child array: "values" as an array of the type parameter
> >>>>>>>>>>
> >>>>>>>>>> validity_bitmap is used to differentiate between empty array
> >>>> views
> >>>>>>>>>> (sizes[i] == 0) and NULL array views (validity_bitmap[i] == 0).
> >>>>>>>>>>
> >>>>>>>>>> When the validity_bitmap[i] is 0, both sizes and offsets are
> >>>>>> undefined
> >>>>>>>>> (as
> >>>>>>>>>> usual), and when sizes[i] == 0, offsets[i] is undefined. 0 is
> >>>>>> recommended
> >>>>>>>>>> if setting a value is not an issue to the system producing the
> >>>>>> arrays.
> >>>>>>>>>> offsets buffer is not required to be ordered and views don't
> have
> >>>>> to
> >>>>>> be
> >>>>>>>>>> disjoint.
> >>>>>>>>>>
> >>>>>>>>>> [1]
> >>>>>>>>>>
> >>>>
> >>
> https://facebookincubator.github.io/velox/develop/vectors.html#arrayvector
> >> <
> >>
> https://facebookincubator.github.io/velox/develop/vectors.html#arrayvector
> >>>
> >>>>>>>>>> Thanks,
> >>>>>>>>>> Felipe O. Carvalho
> >>>>>>>>>>
> >>
>
>

Reply via email to