Athena (Hive/Presto) Parquet vs ORC 计数查询

Posted

技术标签:

【中文标题】Athena (Hive/Presto) Parquet vs ORC 计数查询【英文标题】:Athena (Hive/Presto) Parquet vs ORC In Count Query 【发布时间】:2020-08-15 04:43:27 【问题描述】:

我正在 athena 中以 parquet 和 orc 格式测试一个大型数据集(1.5TB,5.5b 条记录)。我的第一个测试是一个简单的,计数查询-

SELECT COUNT(*) FROM events_orc
SELECT COUNT(*) FROM events_parquet

parquet 文件作为 orc 文件运行此查询需要一半时间。但我注意到的一件事是,当对 parquet 文件运行计数时,它会在扫描字节时返回 0kb,而对于 orc,它会返回 78gb。这对镶木地板很有意义,因为计数在元中,无需扫描字节。 orc 也有一个带有计数的元数据,但它似乎没有使用该元数据来确定这些文件的计数。

为什么 Athena 不使用 orc 文件中的元数据来确定计数,而在 parquet 文件中显然是这样做的?

【问题讨论】:

在ORC的情况下你的数据压缩了吗? 【参考方案1】:

正如您所说,答案是 Athena 读取 Parquet 元数据,而不是 ORC。除了该功能不在 Athena 使用的 Presto 和/或 ORC serde 版本中之外,没有其他理由。

我还注意到 Athena 在使用 ORC 时读取了太多数据,它不会跳过它应该跳过的列,等等。我认为 Athena ORC serde 只是旧的并且没有你所期望的所有优化。 Athena 毕竟是基于一个非常古老的 Presto 版本。

【讨论】:

【参考方案2】:

这取决于这些 ORC 文件是如何创建的。您能否解释一下您是如何在数据中进行 ETL 以及表定义是什么?

ORC 的索引很少:

索引 ORC 在每个文件中提供三个级别的索引:

文件级别:

关于整个文件每列中的值的统计信息

条带级别:

关于每个列中每个值的统计信息 条纹

行级:

关于每组 10,000 行的每列中的值的统计信息 在条带内 文件和条带级别的列统计信息位于 文件页脚,以便它们易于访问以确定其余部分是否 文件的所有内容都需要读取。行级索引包括 每个行组的列统计信息和查找的位置 到行组的开头。

Athena 就像 PrestoDb 一样,Athena 使用的查询引擎可以使用这些索引来加速查询。

如果 Athena 不使用这些信息进行查询,我会感到非常惊讶。

【讨论】:

以上是关于Athena (Hive/Presto) Parquet vs ORC 计数查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive/Presto 中将文件路径拆分为其组成路径

Impala,Presto和Hive在MR3上的性能评估

如何在 Amazon EMR 上将连接器添加到 presto

生产环境中的 Hive 与 Spark

从 s3 的 Athena 中的 2 个外部表更新 Athena 表

Athena - 改变表级联