为后续 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 中搜索的存储桶不会超过它必须搜索的数量?
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> );
Presto 社区目前正在处理 Dynamic Filtering in Presto,这将得到改进。
我有几个 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 中搜索的存储桶不会超过它必须搜索的数量?
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> );
Presto 社区目前正在处理 Dynamic Filtering in Presto,这将得到改进。