你如何让 Athena/Presto 识别 parquet 索引

How do you get Athena/Presto to recognize parquet index

我有一个 25k "row" 镶木地板文件(总计 469.5kb),其中镶木地板中的每个项目都有一个唯一的整数 ID。知道这一点后,我已经在此列上建立了索引,但在使用 Athena(AWS 服务)/Presto(底层引擎)时,索引该列实际上并没有影响性能。我正在尝试一个简单的 select 从我想通过它的 id-

拉出其中一行的地方
SELECT *
FROM widgets w
WHERE w.id = 1

id 列已编入索引,因此一旦 Presto 找到此匹配项,它就不应再进行任何扫描。该列也是有序的,因此它应该能够进行二进制搜索来解析位置而不是哑扫描。

我可以判断索引是否被正确使用,因为 Athena returns 操作中扫描的字节数。有无索引,Athena returns 文件本身的字节大小作为扫描大小,意味着它扫描了整个文件。可以肯定的是,将 id 排在第一行的顺序也没有影响。

当前版本的 Athena/Presto 无法做到这一点吗?我正在使用 python、pandas 和 pyarrow。

您没有说明您是如何创建索引的,我假设您是在谈论 Hive 索引。根据 1 and 2, Presto does not support Hive indexes. According to 3,Hive 本身已在 Hive 3 中放弃了对它们的支持。

这回答了您关于为什么索引的存在不影响 Presto 执行查询的方式的问题。那么还有哪些其他方法可以限制必须处理的数据量?

  • Parquet 元数据包括每个列的每个行组的最小值和最大值。如果您的 table 中有多个行组,则只会读取可能匹配的那些。
  • 即将推出的 PARQUET-1201 功能会将页面级索引添加到 Parquet 文件本身。
  • 如果您查询特定的列,将只读取那些列。
  • 如果您的 table 已分区,过滤 "partition by" 列将仅读取该分区。

但是请注意,所有这些措施仅对大于 500KB 的几个数量级的数据大小有意义。事实上,Parquet 本身对于如此小的 tables 来说是一个大材小用。行组的默认大小为 128MB,您应该有很多行组。