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 计数查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Amazon EMR 上将连接器添加到 presto