【问题标题】:Retrieving bucketting value in WITH statement for subsequent SELECT在 WITH 语句中为后续 SELECT 检索分桶值
【发布时间】:2019-08-29 13:59:56
【问题描述】:

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

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

表1

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

表2

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

分桶/集群列是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 不会在第二个表中搜索比它必须搜索的更多的桶?

【问题讨论】:

    标签: presto amazon-athena


    【解决方案1】:

    Athena 基于 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> );
    

    这将通过添加 Dynamic Filtering in Presto 得到改进,Presto 社区目前正在努力。

    【讨论】:

    • 啊,它是基于 Presto 的,我的错。感谢您的回答 - 虽然我希望只是我做错了什么,但很高兴被告知答案只是它尚未实施。也很高兴看到 github 问题 - 将密切关注这一点。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多