sql—按行排序时优化配置单元组

dfty9e19  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(257)

我有以下(非常简单的)配置单元查询:

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,所以我认为优化的执行可能会占用很小的内存,而且速度更快(因为不需要循环组键)。

yvt65v4c

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。

相关问题