gpt4 book ai didi

parquet - Apache 拼花和箭头之间的区别

转载 作者:行者123 更新时间:2023-12-04 02:40:26 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

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

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

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

    关于parquet - Apache 拼花和箭头之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472727/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com