python - 如何让 Athena/Presto 识别 parquet 索引

标签 python pandas parquet amazon-athena presto

我有一个 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 索引。根据12 ,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/

相关文章:

python - 使用 SCons 创建分层构建

python - 绘制 Pandas 数据框的多行

python - 如何使用 scikit learn/pandas/python 打印任意一个集群的样本/观察结果/行?

java - SQLcontext 将字符串字段更改为 Long : Spark 1. 5

python yaml.dump 缩进错误

python:使用 TLS 的 smtp 不传递任何消息

python - Pandas groupby 标识另一列中具有最大值的元素

python - 使用 Spectrify 将数据以 Parquet 格式从 Redshift 卸载到 S3

java - 在 Spark java 中使用 Dataframe 合并两个 parquet 文件

python - 处理并行 ftp 下载错误