Apache Parquet和Arrow的区别

157

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

它们都是列化数据结构。最初我认为parquet是用于磁盘的,而arrow是用于内存格式的。然而,我刚刚了解到,您也可以像abc.arrow这样将arrow保存到文件中。这种情况下,它们有什么区别吗?他们不是在做同样的事情吗?

1个回答

376

Parquet是一种用于数据序列化的列式文件格式。读取Parquet文件需要将其内容解压缩和解码成某种内存数据结构。它旨在通过牺牲解码的CPU利用率来实现空间/IO效率。它不提供任何内存计算的数据结构。Parquet是一种流式格式,必须从开头到结尾进行解码,虽然最近已经添加了一些“索引页”功能以改进存储格式,但通常随机访问操作代价较高。

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

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

Arrow协议旨在使您能够“映射”一块Arrow数据而无需进行任何反序列化,因此对磁盘上的Arrow协议数据进行分析可以使用内存映射并几乎不需要任何成本。该协议用于许多方面,例如在Spark SQL和Python之间流式传输数据,以便运行Pandas函数来处理Spark SQL数据块的这些称为“ pandas udfs ”。

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

  • Parquet旨在用于“归档”目的,即如果您今天编写一个文件,则我们期望任何声称可以“读取Parquet”的系统都能够在5年或7年后读取该文件。我们还未对Arrow格式的长期稳定性做出此断言(尽管我们将来可能会)
  • 解码Parquet文件通常要花费更多代价,因为它必须被解码成其他数据结构。 Arrow协议数据可以直接进行内存映射。
  • 由于Parquet使用的数据编码方案,Parquet文件通常比磁盘上的Arrow协议数据小得多。如果您的磁盘存储或网络速度很慢,则Parquet将是更好的选择

因此,总之,Parquet文件适用于磁盘存储,而Arrow适用于内存中(但您也可以将其放在磁盘上,然后稍后进行内存映射)。它们旨在彼此兼容并在应用程序中一起使用。

如果需要一个内存密集型的前端应用程序,我建议考虑使用Arrow JavaScript(TypeScript)库。


2
你很棒!谢谢! - Audrey
@Wes McKinney,“内存中”的意思是应该有某种平台将这些箭头数据保留在内存中?一些运行在大型集群中的内存计算平台?(例如像Ignite这样的平台)? - Ashika Umanga Umagiliya
Arrow有一个页面,其中的信息更加更新。截至2021年7月11日,FAQ建议Parquet仍然是长期存储的首选(而不是Arrow)--“虽然Arrow磁盘格式稳定,并且将可以被未来版本的库读取,但它并没有优先考虑长期归档存储的要求”。 - HCSF
4
为什么Parquet被提及为一种流式格式?这意味着什么?我原本认为我们必须解析整个文件才能读取数据。 - ns15
能否直接从S3查询/读取大型Parquet或Arrow文件,而无需完全下载它(例如使用字节范围)? - collimarco
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接