So each community would have its own version of the Arrow format?


Le 14/06/2023 à 22:47, Aldrin a écrit :
> Arrow has at least 7 native "official" implementations... 5 bindings on C++... and likely other implementations (like arrow2 in rust)

 I think it is worth remembering that depending on what level of support
ListView aspires to, such an addition could require non trivial changes to
many / all of those implementations (and the APIs they expose).

Can't implementations add support as needed? I assume that the "depending on what support [it] aspires to" implies this, but if a feature isn't used in a community then it can leave it unimplemented. On the flip side, if it is used in a community (e.g. C++) is there no way to upstream it without the support of every community?



Sent from Proton Mail for iOS


On Wed, Jun 14, 2023 at 13:06, Raphael Taylor-Davies <r.taylordav...@googlemail.com.INVALID <mailto:On Wed, Jun 14, 2023 at 13:06, Raphael Taylor-Davies <<a href=>> wrote:
Even something relatively straightforward becomes a huge implementation
effort when multiplied by a large number of codebases, users and
datasets. Parquet is a great source of historical examples of the
challenges of incremental changes that don't meaningfully unlock new
use-cases. To take just one, Int96 was deprecated almost a decade ago,
in favour of some additional metadata over an existing physical layout,
and yet Int96 is still to the best of my knowledge used by Spark by default.

That's not to say that I think the arrow specification should ossify and
we should never change it, but I'm not hugely enthusiastic about adding
encodings that are only incremental improvements over existing encodings.

I therefore wonder if there are some new use-cases I am missing that
would be unlocked by this change, and that wouldn't be supported by the
dictionary proposal? Perhaps you could elaborate here? Whilst I do agree
using dictionaries as proposed is perhaps a less elegant solution, I
don't see anything inherently wrong with it, and if it ain't broke we
really shouldn't be trying to fix it.

Kind Regards,

Raphael Taylor-Davies

On 14 June 2023 17:52:52 BST, Felipe Oliveira Carvalho
<felipe...@gmail.com> wrote:

General approach to alternative formats aside, in the specific case
of ListView, I think the implementation complexity is being
overestimated in these discussions. The C++ Arrow implementation
shares a lot of code between List and LargeList. And with some
tweaks, I'm able to share that common infrastructure for ListView as
well. [1] ListView is similar to list: it doesn't require offsets to
be sorted and adds an extra buffer containing sizes. For symmetry
with the List and LargeList types (FixedSizeList not included), I'm
going to propose we add a LargeListView. That is not part of the
draft implementation yet, but seems like an obvious thing to have
now that I implemented the `if_else` specialization. [2] David Li
asked about this above and I can confirm now that 64-bit version of
ListView (LargeListView) is in the plans. Trying to avoid
re-implementing some kernels is not a good goal to chase, IMO,
because kernels need tweaks to take advantage of the format. [1]
https://github.com/apache/arrow/pull/35345 [2]
https://github.com/felipecrv/arrow/commits/list_view_backup --
Felipe On Wed, Jun 14, 2023 at 12:08 PM Weston Pace
<weston.p...@gmail.com> wrote:

perhaps we could support this use-case as a canonical
extension type over dictionary encoded, variable-sized arrays

I believe this suggestion is valid and could be used to solve
the if-else case. The algorithm, if I understand it, would be
roughly: ``` // Note: Simple pseudocode, vectorization left as
exercise for the reader auto indices_builder = ... auto
list_builder = ... indices_builder.resize(batch.length); Array
condition_mask = condition.EvaluateBatch(batch); for row_index
in selected_rows(condition_mask): indices_builder[row_index] =
list_builder.CurrentLength();
list_builder.Append(if_expr.EvaluateRow(batch, row_index)) for
row_index in unselected_rows(condition_mask):
indices_builder[row_index] = list_builder.CurrentLength();
list_builder.Append(else_expr.EvaluateRow(batch, row_index))
return DictionaryArray(indices_builder.Finish(),
list_builder.Finish()) ``` I also agree this is a slightly
awkward use of dictionaries (e.g. the dictionary would have the
same size as the # of indices) and perhaps not the most
intuitive way to solve the problem. My gut reaction is simply
"an improved if/else kernel is not, alone, enough justification
for a new layout" and yet... I think we are seeing the start (I
hope) of a trend where Arrow is not just used "between systems"
(e.g. to shuttle data from one place to another, or between a
query engine and a visualization tool) but also "within systems"
(e.g. UDFs, bespoke file formats and temporary tables, between
workers in a distributed query engine). When arrow is used
"within systems" I think both the number of bespoke formats and
the significance of conversion cost increases. For example, it's
easy to say that Velox should convert at the boundary as data
leaves Velox. But what if Velox (or datafusion or ...) were to
define an interface for UDFs. Would we want to use Arrow there
(e.g. the C data interface is a good fit)? If so, wouldn't the
conversion cost be more significant?

Also, I'm very lukewarm towards the concept of "alternative
layouts" suggested somewhere else in this thread. It does
not seem a good choice to complexify the Arrow format that
much.

I think, in my opinion, this depends on how many of these
alternative layouts exist. If there are just a few, then I
agree, we should just adopt them as formal first-class layouts.
If there are many, then I think it will be too much complexity
in Arrow to have all the different choices. Or, we could say
there are many, but the alternatives don't belong in Arrow at
all. In that case I think it's the same question as the above
paragraph, "do we want Arrow to be used within systems? Or just
between systems?" On Wed, Jun 14, 2023 at 2:07 AM Antoine Pitrou
<anto...@python.org> wrote:

I agree that ListView cannot be an extension type, given
that it features a new layout, and therefore cannot
reasonably be backed by an existing storage type (AFAICT).
Also, I'm very lukewarm towards the concept of "alternative
layouts" suggested somewhere else in this thread. It does
not seem a good choice to complexify the Arrow format that
much. Regards Antoine. Le 07/06/2023 à 00:21, Felipe
Oliveira Carvalho a écrit :

+1 on what Ian said. And as I write kernels for this new
format, I’m learning that it’s

possible

to re-use the common infrastructure used by List and
LargeList to

implement

the ListView related features with some adjustments. IMO
having this format as a second-class citizen would more
likely complicate things because it would make this
unification harder. — Felipe On Tue, 6 Jun 2023 at 18:45
Ian Cook <ianmc...@apache.org> wrote:

To clarify why we cannot simply propose adding
ListView as a new “canonical extension type”: The
extension type mechanism in Arrow depends on the
underlying data being organized in an existing Arrow
layout—that way an implementation that does not
support the extension type can still handle the
underlying data. But ListView is a wholly new
layout. I strongly agree with Weston’s idea that it
is a good time for Arrow to introduce the notion of
“canonical alternative layouts.” Taken together, I
think that canonical extension types and canonical
alternative layouts could serve as an “incubator”
for proposed new representations. For example, if a
proposed canonical alternative layout ends up being
broadly adopted, then that will serve as a signal
that we should consider adding it as a primary
layout in the core spec. It seems to me that most
projects that are implementing Arrow today are not
aiming to provide complete coverage of Arrow; rather
they are adopting Arrow because of its role as a
standard and they are implementing only as much of
the Arrow standard as they require to achieve some
goal. I believe that such projects are important
Arrow stakeholders, and I believe that this proposed
notion of canonical alternative layouts will serve
them well and will create efficiencies by
standardizing implementations around a shared set of
alternatives. However I think that the documentation
for canonical alternative layouts should strongly
encourage implementers to default to using the
primary layouts defined in the core spec and only
use alternative layouts in cases where the primary
layouts do not meet their needs. On Sat, May 27,
2023 at 7:44 PM Micah Kornfield <

emkornfi...@gmail.com>

wrote:

This sounds reasonable to me but my main concern
is, I'm not sure

there

is

a great mechanism to enforce canonical layouts
don't somehow become

default

(or the only implementation). Even for these new
layouts, I think it might be worth rethinking

binding

a

layout into the schema versus having a different
concept of encoding

(and

changing some of the corresponding data
structures). On Mon, May 22, 2023 at 10:37 AM
Weston Pace <weston.p...@gmail.com>

wrote:

Trying to settle on one option is a
fruitless endeavor. Each type

has

pros

and cons. I would also predict that the
largest existing usage of

Arrow is

shuttling data from one system to another.
The newly proposed

format

doesn't appear to have any significant
advantage for that use case

(if

anything, the existing format is arguably
better as it is more

compact).

I am very biased towards historical
precedent and avoiding breaking changes. We
have "canonical extension types", perhaps it
is time for

"canonical

alternative layouts". We could define it as
such: * There are one or more primary
layouts * Existing layouts are automatically
considered primary layouts,

even if

they wouldn't have been primary layouts
initially (e.g. large list) * A new layout,
if it is semantically equivalent to another, is

considered

an alternative layout * An alternative
layout still has the same requirements for

adoption

(two

implementations and a vote) * An
implementation should not feel pressured to
rush and

implement

the

new layout. It would be good if they
contribute in the discussion and

consider the

layout and vote if they feel it would be an
acceptable design. * We can define and vote
and approve as many canonical alternative

layouts

as we want: * A canonical alternative layout
should, at a minimum, have some reasonable
justification, such as improved performance for

algorithm X

* Arrow implementations MUST support the
primary layouts * An Arrow implementation
MAY support a canonical alternative,

however:

* An Arrow implementation MUST first support
the primary layout * An Arrow implementation
MUST support conversion to/from the

primary

and canonical layout * An Arrow
implementation's APIs MUST only provide data
in the alternative layout if it is
explicitly asked for (e.g. schema inference

should

prefer the primary layout). * We can still
vote for new primary layouts (e.g. promoting a

canonical

alternative) but, in these votes we don't
only consider the value (e.g. performance) of

the

layout

but also the interoperability. In other
words, a layout can only become a primary
layout if

there

is

significant evidence that most
implementations plan to adopt it. This lets
us evolve support for new layouts more
naturally. We can generally assume that
users will not, initially, be aware of these
alternative layouts. However, everything
will just work. They may

start

to see a performance penalty stemming from a
lack of support for

these

layouts. If this performance penalty becomes
significant then they

will

discover it and become aware of the problem.
They can then ask

whatever

library they are using to add support for
the alternative layout.

As

enough users find a need for it then
libraries will add support. Eventually,
enough libraries will support it that we can
adopt it

as a

primary layout. Also, it allows libraries to
adopt alternative layouts more

aggressively if

they would like while still hopefully
ensuring that we eventually

all

converge on the same implementation of the
alternative layout. On Mon, May 22, 2023 at
9:35 AM Will Jones <will.jones...@gmail.com

wrote:

Hello Arrow devs, I don't understand why
we would start deprecating features in the

Arrow

format. Even starting this talk
might already be a bad idea

PR-wise.

I agree we don't want to make breaking
changes to the Arrow format.

But

several maintainers have already stated
they have no interest in maintaining
both list types with full compute
functionality [1][2],

so I

think it's very likely one list type or
the other will be implicitly preferred
in the ecosystem if this data type was
added.

If

that's the case, I'd prefer that we
agreed as a community which one

should

be preferred. Maybe that's not the best
path; it's just one way for

us to

balance stability, maintenance burden,
and relevance. Can someone help distill
down the primary rationale and usecase for

adding ArrayView to the Arrow Spec?

Looking back at that old thread, I think
one of the main

motivations

is

to

try to prevent query engine implementers
from feeling there is a

tradeoff

between having state-of-the-art
performance and being Arrow-native.

For

some of the new array types, we had both
Velox and DuckDB use them,

so it

was reasonable to expect they were
innovations that might

proliferate.

I'm

not sure if the ArrayView is part of
that. From Wes earlier [3]: The idea is
that in a world of data and query
federation (for

example,

consider [1] where Arrow is being
used as a data federation layer

with

many

query engines), we want to increase
the amount of data in-flight

and

in-memory that is in Arrow format.
So if query engines are having

to

depart

substantially from the Arrow format
to get performance, then this

creates a

potential lose-lose situation: *
Depart from Arrow: get better

performance

but pay serialization costs to read
and write Arrow (the

performance

and

resource utilization benefits
outweigh the serialization costs).

This

puts

additional pressure on query engines
to build specialized

components

for

solving problems rather than making
use of off-the-shelf

components

that

use Arrow. This has knock-on effects
on ecosystem fragmentation. *

Or

use

Arrow, and accept suboptimal query
processing performance

Will mentions one usecase is Velox
consuming python UDF output,

which

seems

to be mostly about how fast Velox
can consume this format, not how

fast

it

can be written. Are there other
usecases?

To be clear, I don't know if that's the
use case they want. That's

just

me

speculating. I still have some questions
myself: 1. Is this array type currently
only used in Velox? (not DuckDB

like

some

of the other new types?) What evidence
do we have that it will

become

used

outside of Velox? 2. We already have
three list types: list, large list (64-bit

offsets),

and

fixed size list. Do we think we will
only want a view version of

the

32-bit

offset variable length list? Or are we
potentially talking about

view

variants for all three? Best, Will Jones
[1]

https://lists.apache.org/thread/smn13j1rnt23mb3fwx75sw3f877k3nwx

[2]

https://lists.apache.org/thread/cc4w3vs3foj1fmpq9x888k51so60ftr3

[3]

https://lists.apache.org/thread/mk2yn62y6l8qtngcs1vg2qtwlxzbrt8t

On Mon, May 22, 2023 at 3:48 AM Andrew
Lamb <al...@influxdata.com>

wrote:

Can someone help distill down the
primary rationale and usecase

for

adding ArrayView to the Arrow Spec?
From the above discussions, the
stated rationale seems to be fast
(zero-copy) interchange with Velox.
This thread has qualitatively
enumerated the benefits of

(offset+len)

encoding over the existing Arrow
ListArray (offets) approach, but

I

haven't

seen any performance measurements
that might help us to gauge the

tradeoff

in additional complexity vs runtime
overhead. Will mentions one usecase
is Velox consuming python UDF output,

which

seems

to be mostly about how fast Velox
can consume this format, not how

fast

it

can be written. Are there other
usecases? Do we have numbers showing
how much overhead converting to /from

Velox's

internal representation and the
existing ListArray adds? Has

anyone in

Velox land considered adding faster
support for Arrow style

ListArray

encoding? Andrew On Mon, May 22,
2023 at 4:38 AM Antoine Pitrou <

anto...@python.org

wrote:

Hi, I don't understand why we
would start deprecating features
in the

Arrow

format. Even starting this talk
might already be a bad idea

PR-wise.

As for implementing conversions
at the I/O boundary, it's a

reasonably

policy, but it still requires
work by implementors and it's not

granted

that all consumers of the Arrow
format will grow such
conversions if/when we add
non-trivial types such as
ListView or StringView. Regards
Antoine. Le 22/05/2023 à 00:39,
Will Jones a écrit :

One more thing: Looking back
on the previous discussion[1]

(which

Weston

pointed out in his earlier
message), Jorge suggested
that the

old

list

types might be deprecated in
favor of view variants [2].
Others

were

worried that it might
undermine the perception
that the Arrow

format

is

stable. I think it might be
worth thinking about "soft

deprecating"

the

old

list type: suggesting new
implementations prefer the list

view, but

reassuring that
implementations should
support the old format,

even

if

they

just convert to the new
format. To be clear, this
wouldn't

mean we

plan

to

create breaking changes in
the format; but if we ever
did for

other

reasons, the old list type
might go. Arrow compute
libraries could choose
either format for compute

support,

and

plan to do conversion at the
boundaries. Libraries that use

the new

type

will have cheap conversion
when reading the old type.
Meanwhile

those

that

are still on the old type
will have some incentive to
move

towards

the

new

one, since that conversion
will not be as efficient. [1]

https://lists.apache.org/thread/49qzofswg1r5z7zh39pjvd1m2ggz2kdq


[2]

https://lists.apache.org/thread/smn13j1rnt23mb3fwx75sw3f877k3nwx


On Sun, May 21, 2023 at
3:07 PM Will Jones <

will.jones...@gmail.com>

wrote:

Hello, I think Sasha
brings up a good point,
that the advantages of

this

format

seem to be primarily
about query processing.
Other encodings

like

REE

and

dictionary have
space-saving advantages
that justify them

simply

in

terms

of space efficiency
(although they have
query processing

advantages

as

well). As discussed,
most use cases are
already well served by

existing

list types and
dictionary encoding. I
agree that there are
cases where transferring
this type

without

conversion would be
ideal. One use case I
can think of is if

Velox

wants to

be able to take
Arrow-based UDFs
(possibly written with

PyArrow,

for

example) that operate on
this column type and
therefore wants

zero-copy

exchange over the C Data
Interface. One big
question I have: we
already have three list
types:

list,

large

list (64-bit offsets),
and fixed size list. Do
we think we

will

only

want a

view version of the
32-bit offset variable
length list? Or

are we

potentially talking
about view variants for
all three? Best, Will
Jones On Sun, May 21,
2023 at 2:19 PM Felipe
Oliveira Carvalho <
felipe...@gmail.com> wrote:

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
<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
<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: <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
<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
<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