我有以下(非常简单的)配置单元查询:
select user_id, event_id, min(time) as start, max(time) as end,
count(*) as total, count(interaction == 1) as clicks
from events_all
group by user_id, event_id;
该表具有以下结构:
user_id event_id time interaction
Ex833Lli36nxTvGTA1Dv juCUv6EnkVundBHSBzQevw 1430481530295 0
Ex833Lli36nxTvGTA1Dv juCUv6EnkVundBHSBzQevw 1430481530295 1
n0w4uQhOuXymj5jLaCMQ G+Oj6J9Q1nI1tuosq2ZM/g 1430512179696 0
n0w4uQhOuXymj5jLaCMQ G+Oj6J9Q1nI1tuosq2ZM/g 1430512217124 0
n0w4uQhOuXymj5jLaCMQ mqf38Xd6CAQtuvuKc5NlWQ 1430512179696 1
我知道行首先是按 user_id
然后 event_id
.
问题是:有没有一种方法可以“提示”配置单元引擎在给定行已排序的情况下优化查询?优化的目的是避免在内存中保留所有组,因为一次只需要保留一个组。
现在,这个查询在一个6节点16gbhadoop集群中运行,大约有300gb的数据,大约需要30分钟,并且占用了大部分ram,阻塞了系统。我知道每个小组都很小,每个小组不超过100行 (user_id, event_id)
tuple,所以我认为优化的执行可能会占用很小的内存,而且速度更快(因为不需要循环组键)。
1条答案
按热度按时间yvt65v4c1#
创建一个带扣的排序表。优化器将知道它是从元数据排序的。参见此处示例(官方文件):https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-bucketedsortedtables公司
仅计数交互=1:
count(case when interaction=1 then 1 end) as clicks
-case将所有行标记为1或null,并且只计数1s。