我有一个 25k“行” Parquet 文件(总计 469.5kb),其中 Parquet 中的每个项目都有一个唯一的整数 ID。知道这一点后,我已在此列上放置了索引,但在使用 Athena(AWS 服务)/Presto(底层引擎)时,对该列建立索引实际上并不会影响性能。我正在尝试从我想要通过 id 提取其中一行的位置进行简单的选择-
SELECT *
FROM widgets w
WHERE w.id = 1
id
列已建立索引,因此一旦 Presto 找到此匹配项,它就不应该进行任何进一步的扫描。该列也是有序的,因此它应该能够进行二分搜索来解析位置,而不是进行哑扫描。
我可以判断索引是否使用正确,因为 Athena 返回操作中扫描的字节数。无论有没有索引,Athena 都会返回文件本身的字节大小作为扫描大小,这意味着它扫描了整个文件。可以肯定的是,使 id 位于第一行的排序也不会产生影响。
当前版本的 Athena/Presto 无法实现此功能吗?我正在使用 python、pandas 和 pyarrow。
最佳答案
您没有指定如何创建索引,我假设您正在谈论 Hive 索引。根据1和 2 ,Presto不支持Hive索引。根据3 ,Hive 本身已在 Hive 3 中放弃了对它们的支持。
这回答了您关于为什么索引的存在不会影响 Presto 执行查询的方式的问题。那么还有什么其他方法来限制必须处理的数据量呢?
- Parquet 元数据包括每列的每个行组的最小值和最大值。如果表中有多个行组,则只会读取可能匹配的行组。
- 即将推出的PARQUET-1201该功能会将页面级索引添加到 Parquet 文件本身。
- 如果您查询特定列,则只会读取这些列。
- 如果您的表已分区,则过滤“分区依据”列将仅读取该分区。
但请注意,所有这些措施仅对大于 500KB 几个数量级的数据大小有意义。事实上,对于如此小的 table 来说,Parquet 本身就有点大材小用了。行组的默认大小为 128MB,并且您应该有许多行组。
关于python - 如何让 Athena/Presto 识别 parquet 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52472054/