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

时间:2019-06-06 07:25:40

标签: parquet apache-arrow

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

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

1 个答案:

答案 0 :(得分:8)

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

另一方面,箭头首先是为内存计算提供列数据结构的库。读取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)库。