提问者:小点点

Apache镶木地板和箭头之间的区别


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

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


共1个答案

匿名用户

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

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

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

这个Arrow协议的设计是为了让你可以在不做任何反序列化的情况下“映射”Arrow数据,因此在磁盘上对Arrow协议数据执行分析可以使用内存映射并有效地支付零成本。该协议用于许多事情,例如在SparkSQL和Python之间流式传输数据,用于针对SparkSQL数据块运行熊猫函数,这些被称为“熊猫udfs”。

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

  • Parquet是为了存档目的,这意味着如果你今天写一个文件,我们希望任何说他们可以读取Parquet的系统都能在5年或7年内读取该文件。我们还没有对箭头格式的长期稳定性做出这样的断言(尽管我们将来可能会这样做)
  • 读取Parquet通常要昂贵得多,因为它必须解码成其他数据结构。箭头协议数据可以简单地进行内存映射。
  • 由于Parquet使用的数据编码方案,Parquet文件通常比磁盘上的箭头协议小得多。如果您的磁盘存储或网络速度较慢,Parquet将是更好的选择

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

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