小编典典

对行进行排序时优化Hive GROUP BY

sql

我有以下(非常简单)Hive查询:

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

问题是:鉴于行已排序,有没有一种方法可以“提示” Hive引擎来优化查询?优化的目的是避免将所有组都保留在内存中,因为这一次仅需保留一个组即可。

现在,此查询在具有大约300 GB数据的6节点16 GB
Hadoop集群中运行,大约需要30分钟,并且使用了大部分RAM,这使系统感到窒息。我知道每个组(user_id, event_id)都很小,每个元组不超过100行,因此我认为优化的执行可能会占用很小的内存,而且速度也会更快(因为不需要循环组键)。


阅读 225

收藏
2021-04-28

共1个答案

小编典典

创建一个存储桶的排序表。优化器将知道它是根据元数据排序的。在此处查看示例(官方文档):https :
//cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-
BucketedSortedTables

仅计数互动= 1: count(case when interaction=1 then 1 end) as clicks-大小写会将所有行标记为1或为null,并且仅计数1s。

2021-04-28