Apache Arrow is 10 years old
159 points
by tosh
9 hours ago
| 7 comments
| arrow.apache.org
| HN
data_ders
6 hours ago
[-]
if I could tell myself in 2015 who had just found the feather library and was using it to power my unhinged topic modeling for power point slides work, and explained what feather would become (arrow) and the impact it would have on the date ecosystem. I would have looked at 2026 me like he was a crazy person.

Yet today I feel it was 2016 dataders who is the crazy one lol

reply
ayhanfuat
6 hours ago
[-]
Indeed. feather was a library to exchange data between R and pandas dataframes. People tend to bash pandas but its creator (Wes McKinney) has changed the data ecosystem for the better with the learnings coming from pandas.
reply
jtbaker
5 hours ago
[-]
I know pandas has a lot of technical warts and shortcomings, but I'm grateful for how much it empowered me early in my data/software career, and the API still feels more ergonomic to me due to the years of usage - plus GeoPandas layering on top of it.

Really, prefer DuckDB SQL these days for anything that needs to perform well, and feel like SQL is easier to grok than python code most of the time.

reply
0xcafefood
6 hours ago
[-]
Do people bash pandas? If so, it reminds me of Bjarne's quip that the two types of programming languages are the ones people complain about and the ones nobody uses.
reply
postexitus
6 hours ago
[-]
polars people do - although I wouldn't call polars something that nobody uses.
reply
ayhanfuat
6 hours ago
[-]
I also use polars in new projects. I think Wes McKinney also uses it. If I remember correctly I saw him commenting on some polars memory related issues on GitHub. But a good chunk of polars' success can be attributed to Arrow which McKinney co-created. All the gripes people have with pandas, he had them too and built something powerful to overcome those.
reply
mistrial9
5 hours ago
[-]
I saw Wes speak in the early days of Pandas, in Berkeley. He solved problems that others just worked around for decades. His solutions are quirky but the work was very solid. His career advanced a lot IMHO for substantial reasons.. Wes personally marched through swamps and reached the other side.. others complain and do what they always have done.. I personally agree with the criticisms of the syntax, but Pandas is real and it was not easy to build it.
reply
aynyc
3 hours ago
[-]
What's the difference between feather and parquet in terms of usage? I get the design philosophy, but how would you use them differently?
reply
tosh
3 hours ago
[-]
parquet is optimized for storage and compresses well (=> smaller files)

feather is optimized for fast reading

reply
aynyc
2 hours ago
[-]
Given the cost of storage is getting cheaper, wouldn't most firms want to use feather for analytic performance? But everyone uses parquet.
reply
yencabulator
1 hour ago
[-]
You can, still, gain a lot of performance by doing less I/O.
reply
outside1234
2 hours ago
[-]
What people have done in the face of cheaper storage is store more data.
reply
twic
1 hour ago
[-]
And now there's Lance! https://lance.org/
reply
dionian
3 hours ago
[-]
reply
aynyc
3 hours ago
[-]
I read that. But afaik, feather format is stable now. Hence my confusion. I use parquet at work a lot, where we store a lot of time series financial data. We like it. Creating the Parquet data is a pain since it's not append-able.
reply
yencabulator
1 hour ago
[-]
Generally Parquet files are combined in an LSM style, compacting smaller files into larger ones. Parquet isn't really meant for the "journal" of level-0 append-one-record style storage, it's meant for the levels that follow.
reply
aynyc
41 minutes ago
[-]
So feather for journaling and parquet for long term processing?
reply
dionian
26 minutes ago
[-]
Have you considered something like iceberg tables?
reply
HoldOnAMinute
43 minutes ago
[-]
I read that entire page and I could not tell you what Apache Arrow is, or what it does.
reply
depr
41 minutes ago
[-]
All you had to do was click the logo to go to the homepage
reply
pm90
5 hours ago
[-]
Its nice to see useful, impactful interchange formats getting the attention and resources they need, and ecosystems converging around them. Optimizing serialization/deserialization might seem like a "trivial" task at first, but when moving petabytes of data they quickly become the bottlenecks. With common interchange formats, the benefits of these optimizations are shared across stacks. Love to see it.
reply
aerzen
3 hours ago
[-]
I like arrow for its type system. It's efficient, complete and does not have "infinite precision decimals". Considering Postgres's decimal encoding, using i256 as the backing type is so much saner approach.
reply
mempko
4 hours ago
[-]
We use Apache Arrow at my company and it's fantastic. The performance is so good. We have terabytes of time-series financial data and use arrow to store it and process it.
reply
kccqzy
3 hours ago
[-]
We use Apache Arrow at my company too. It is part of a migration from an old in-house format. When it works it’s good. But there are just way too many bugs in Arrow. For example: a basic arrow computation on strings segfaults because the result does not fit in Arrow’s string type, only the large string type. Instead of casting it or asking the user to cast it, it just segfaults. Another example: a different basic operation causes an exception complaining about negative buffer sizes when using variable-length binary type.
reply
thinkharderdev
2 hours ago
[-]
This will obviously depend on which implementation you use. Using the rust arrow-rs crate you at least get panics when you overflow max buffer sizes. But one of my enduring annoyances with arrow is that they use signed integer types for buffer offsets and the like. I understand why it has to be that way since it's intended to be cross-language and not all languages have unsigned integer types. But it does lead to lots of very weird bugs when you are working in a native language and casting back and forth from signed to unsigned types. I spent a very frustrating day tracking down this one in particular https://github.com/apache/datafusion/issues/15967
reply
dionian
3 hours ago
[-]
stumbled upon it recently while optimizing parquet writes. It worked flawlessly and 10-20x'd my throughput
reply
actionfromafar
6 hours ago
[-]
I had to look up what Arrow actually does, and I might have to run some performance comparisons vs sqlite.

It's very neat for some types of data to have columns contiguous in memory.

reply
skeeter2020
6 hours ago
[-]
>> some performance comparisons vs sqlite.

That's not really the purpose; it's really a language-independent format so that you don't need to change it for say, a dataframe or R. It's columnar because for analytics (where you do lots of aggregations and filtering) this is way more performant; the data is intentionally stored so the target columns are continuous. You probably already know, but the analytics equivalent of SQLite is DuckDB. Arrow can also eliminate the need to serialize/de-serialize data when sharing (ex: a high performance data pipeline) because different consumers / tools / operations can use the same memory representation as-is.

reply
mandeepj
4 hours ago
[-]
> Arrow can also eliminate the need to serialize/de-serialize data when sharing (ex: a high performance data pipeline) because different consumers / tools / operations can use the same memory representation as-is.

Not sure if I misunderstood, what are the chances those different consumers / tools / operations are running in your memory space?

reply
daddykotex
4 hours ago
[-]
Not an expert, so I could be wrong, but my understanding is that you could just copy those bytes directly from the wire to your memory and treat those as the Arrow payload you're expecting it to be.

You still have to transfer the data, but you remove the need for a transformation before writing to the wire, and a transformation when reading from the wire.

reply
cestith
3 hours ago
[-]
If you are in control of two processes on a single machine instance, you could share the memory between a writer and a read-only consumer.

The key phrase though would seem to be “memory representation”m and not “same memory”. You can spit the in-memory representation out to an Arrow file or an Arrow stream, take it in, and it’s in the same memory layout in the other program. That’s kind of the point of Arrow. It’s a standard memory layout available across applications and even across languages, which can be really convenient.

reply
shadow28
1 hour ago
[-]
Arrow supports zero-copy data sharing - checkout the Arrow IPC format and Arrow Flight.
reply
actionfromafar
5 hours ago
[-]
Thanks! This is all probably me using the familiar sqlite hammer where I really shouldn't.
reply
nu11ptr
6 hours ago
[-]
If I recall, Arrow is more or less a standardized representation in memory of columnar data. It tends to not be used directly I believe, but as the foundation for higher level libraries (like Polars, etc.). That said, I'm not an expert here so might not have full info.
reply
tormeh
6 hours ago
[-]
You can absolutely use it directly, but it is painful. The USP of Arrow ist that you can pass bits of memory between Polars, Datafusion, DuckDB, etc. without copying. It's Parquet but for memory.
reply
skeeter2020
6 hours ago
[-]
This is true, and as a result IME the problem space is much smaller than Parquet, but it can be really powerful. The reality is most of us don't work in environments where Arrow is needed.
reply
tosh
5 hours ago
[-]
Take a look at parquet.

You can also store arrow on disk but it is mainly used as in-memory representation.

reply
data_ders
6 hours ago
[-]
yeah not necessarily compute (though it has a kernel)!

it's actually many things IPC protocol wire protocol, database connectivity spec etc etc.

in reality it's about an in-memory tabular (columnar) representation that enables zero copy operations b/w languages and engines.

and, imho, it all really comes down to standard data types for columns!

reply