为后续 SELECT 在 WITH 语句中检索分桶值

Retrieving bucketting value in WITH statement for subsequent SELECT

我有几个 table 应用了分桶。当我在我的 SELECT 查询中预先指定 bucket/partition 参数时,它可以很好地工作,但是当我从不同的 table 检索我需要的存储桶值时 - 在 WITH select语句,Hive/Athena 似乎不再使用优化,而是搜索整个数据库。我想了解是否有一种方法可以正确编写我的查询以保持优化。

举个简单的例子,我有两个table:

表 1

category | categoryid
---------+-----------
mass     | 1

表 2

categoryid | index | value
-----------+-------+------
1          | 0     | 15
1          | 1     | 10
1          | 2     | 7

bucketed/clustered 列是 categoryid。我有一个 category ('mass'),想检索与我拥有的 category 相对应的 value。所以我设计了我的 SELECT 这样的:

WITH dataset AS (
       SELECT categoryid
       FROM Table1
       WHERE category='mass'
     )
SELECT index,value
  FROM Table2, dataset
  WHERE Table2.categoryid=dataset.categoryid

这将 运行,但似乎会搜索整个数据库,因为 Hive 在开始搜索之前不知道 categoryid 用于分桶?如果我将最后的 Table2.categoryid=dataset.categoryid 换成 Table2.categoryid=1 那么它将只搜索 db 的一部分。

那么有没有什么方法可以编写此查询以确保 Hive 在第二个 table 中搜索的存储桶不会超过它必须搜索的数量?

A​​thena 基于 Presto。除非 Athena 在这方面有一些修改(我认为目前没有),否则这不能在单个查询中工作。

推荐的解决方法:发出一个查询以收集 dataset.categoryid 值。将它们作为常量传递给您的主查询:

WITH dataset AS (
       SELECT category
       FROM Table1
       WHERE category='mass'
     )
SELECT index,value
  FROM Table2, dataset
  WHERE Table2.categoryid = dataset.categoryid
    AND Table2.categoryid IN ( <all possible values> );

Presto 社区目前正在处理 Dynamic Filtering in Presto,这将得到改进。