0

有一张 parquet 数据格式为 20 GB 的表,简单查询仅扫描 1 GB 数据即可得出结果。 select columns from table1 where id in (id1, id2, idn)

如果使用子查询执行相同的查询,例如 - select columns from table1 where id in (select id from table2 limit n)此查询将通过扫描 20GB,整个表来给出结果。即使 n 是非常小的数字,如 10、50 或 5000。

LEFT JOIN 也会发生同样的情况。

SELECT table1.* FROM
table2 LEFT JOIN table1
ON table2.id=table1.id 

有没有办法通过运行单个查询而不是获取和保存子查询的结果并将作为参数传递给另一个查询来实现这一点?当前用户如何在没有全表扫描的情况下在 Athena 上运行 LEFT JOIN 或子查询的任何最佳实践?

类似的问题- 问题 -1问题 -2

4

1 回答 1

1

有没有办法通过运行单个查询而不是获取和保存子查询的结果并将作为参数传递给另一个查询来实现这一点?

这最常见于“动态过滤”。目前没有办法做到这一点。

Athena 基于 Presto,Presto 还不支持动态过滤,但可能会在下一个版本 (Presto 321) 中支持它。您可以在此处跟踪问题:https ://github.com/prestosql/presto/issues/52

Athena 目前基于 Presto 0.172,所以还需要升级。

于 2019-10-07T13:51:03.897 回答