阿帕奇拼花和箭头之间的区别

Posted

技术标签:

【中文标题】阿帕奇拼花和箭头之间的区别【英文标题】:Difference between Apache parquet and arrow 【发布时间】:2019-10-21 16:28:36 【问题描述】:

我正在寻找一种方法来加速我的内存密集型前端 vis 应用程序。我看到有人推荐 Apache Arrow,在我研究的时候,我对 Parquet 和 Arrow 之间的区别感到困惑。

它们都是列式数据结构。最初我认为 parquet 是用于磁盘的,而箭头是用于内存格式的。不过,我刚刚了解到,你也可以将箭头保存到办公桌上的文件中,比如 abc.arrow 那样的话,有什么区别呢?他们不是在做同样的事情吗?

【问题讨论】:

【参考方案1】:

Parquet 是一种用于数据序列化的列文件格式。读取 Parquet 文件需要将其内容解压缩并解码为某种内存数据结构。它被设计为节省空间/IO,但代价是 CPU 用于解码。它不提供任何用于内存计算的数据结构。 Parquet 是一种流格式,必须从头到尾进行解码,而最近在存储格式中添加了一些“索引页面”设施,通常随机访问操作成本很高。

另一方面,Arrow 首先是一个为内存计算提供列数据结构的库。当您读取 Parquet 文件时,您可以将数据解压缩并解码为 箭头柱状数据结构,以便您可以在内存中对解码后的数据执行分析。箭头柱状格式有一些不错的属性:随机访问是 O(1),每个值单元格在内存中与前一个单元格相邻,然后在内存中,因此迭代很有效。

那么“箭头文件”呢? Apache Arrow 定义了一个二进制“序列化”协议,用于安排一组 Arrow 柱状数组(称为“记录批处理”),可用于消息传递和进程间通信。您可以将协议放在任何地方,包括磁盘上,稍后可以将其映射到内存或读入内存并发送到其他地方。

此 Arrow 协议旨在让您无需进行任何反序列化即可“映射”一组 Arrow 数据,因此对磁盘上的 Arrow 协议数据执行分析可以使用内存映射并有效地支付零成本。该协议用于许多事情,例如 Spark SQL 和 Python 之间的流数据,用于针对 Spark SQL 数据块运行 pandas 函数,这些被称为“pandas udfs”。

在某些应用程序中,Parquet 和 Arrow 可互换用于磁盘数据序列化。需要注意的一些事项:

Parquet 旨在用于“存档”目的,这意味着如果您今天编写文件,我们预计任何声称可以“读取 Parquet”的系统将能够在 5 年或 7 年内读取该文件。我们还没有对箭头格式的长期稳定性做出这种断言(尽管我们将来可能会这样做) Parquet 的读取成本通常要高得多,因为它必须被解码为其他数据结构。箭头协议数据可以简单地进行内存映射。 由于 Parquet 使用的数据编码方案,Parquet 文件通常比 Arrow-protocol-on-disk 小得多。如果您的磁盘存储或网络速度较慢,Parquet 将是更好的选择

因此,总而言之,Parquet 文件是为磁盘存储而设计的,Arrow 是为内存而设计的(但您可以将其放在磁盘上,然后再将其放在内存映射中)。它们旨在相互兼容并在应用程序中一起使用。

对于内存密集型前端应用程序,我可能建议查看 Arrow javascript (TypeScript) 库。

【讨论】:

你太棒了!谢谢! @Wes McKinney,“内存中”意味着应该有某种平台将这些箭头数据保存在内存中?一些在大型集群中运行的内存计算平台? (例如 Ignite 之类的)? @WesMcKinney 感谢您的精彩解释。读起来很有趣,很有用 你有关于箭头表内存访问的教程或示例吗? 为什么 parquet 被称为流格式?这是什么意思?我假设我们必须解析整个文件才能读取数据。

以上是关于阿帕奇拼花和箭头之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

阿帕奇骆驼与阿帕奇卡夫卡[重复]

阿帕奇约翰松 VS 杰克逊

二战时期有阿帕奇吗?

【PHP】如何配置阿帕奇汤姆猫服务器?【急】

阿帕奇骆驼和跺脚

服务器中apache(阿帕奇)是个啥软件,干嘛用的