【问题标题】:How do you get Athena/Presto to recognize parquet index你如何让 Athena/Presto 识别镶木地板索引
【发布时间】:2019-02-27 12:51:23
【问题描述】:

我有一个 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。

【问题讨论】:

  • 您是如何(使用哪个组件)创建索引的?

标签: python pandas parquet amazon-athena presto


【解决方案1】:

您没有指定如何创建索引,我假设您在谈论 Hive 索引。根据12,Presto 不支持 Hive 索引。根据3 的说法,Hive 本身已经在 Hive 3 中放弃了对它们的支持。

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

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

但请注意,所有这些措施仅对大于 500KB 的几个数量级的数据大小有意义。事实上,对于这样的小桌子,Parquet 本身就是一种矫枉过正。行组的默认大小为 128MB,您应该有很多行组。

【讨论】:

  • 谢谢你。我想我只是想告诉 prestodb 一个特定的列是唯一的,一旦找到匹配项就不需要进一步查询。我正在对更大(30gb)的数据集进行汇总,并获取结果并加入维度字段(小部件名称等)。我还没有进行任何分区,但这将是我的下一步。那么除此之外还有什么方法可以将镶木地板中的列标记为unique
  • Hive 3.0 将具有 UNIQUE (HIVE-16575),但 Presto 可能还不支持。您可以尝试将 LIMIT 1 添加到您的查询中,以便它们在找到匹配项后停止,但这最多只能为您节省 50% 的平均时间(还有固定成本)。
猜你喜欢
  • 2015-06-29
  • 2017-08-04
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2016-07-04
  • 1970-01-01
  • 2018-06-13
相关资源
最近更新 更多