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

Aud*_*rey 8 parquet apache-arrow

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

它们都是列化数据结构。最初,我认为镶木地板用于磁盘,而箭头则用于内存格式。但是,我刚刚了解到,您也可以将箭头保存到桌面上的文件中,例如abc.arrow。在这种情况下,有什么区别?他们不是在做同样的事情吗?

Wes*_*ney 21

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

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

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

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

在某些应用程序中,Parquet和Arrow可以互换使用,以进行磁盘数据序列化。注意事项:

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

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

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

  • 为什么将 Parquet 称为流格式?这是什么意思?我假设我们必须解析整个文件才能读取数据。 (4认同)