我有以下(非常简单)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。
user_id
event_id
问题是:鉴于行已排序,有没有一种方法可以“提示” Hive引擎来优化查询?优化的目的是避免将所有组都保留在内存中,因为这一次仅需保留一个组即可。
现在,此查询在具有大约300 GB数据的6节点16 GB Hadoop集群中运行,大约需要30分钟,并且使用了大部分RAM,这使系统感到窒息。我知道每个组(user_id, event_id)都很小,每个元组不超过100行,因此我认为优化的执行可能会占用很小的内存,而且速度也会更快(因为不需要循环组键)。
(user_id, event_id)
创建一个存储桶的排序表。优化器将知道它是根据元数据排序的。在此处查看示例(官方文档):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。
count(case when interaction=1 then 1 end) as clicks