我有以下(非常简单)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 引擎在行已排序的情况下优化查询?优化的目的是避免将所有组保留在内存中,因为一次只需要保留一组。
目前,此查询在 6 节点 16 GB Hadoop 集群中运行,数据大约为 300 GB,大约需要 30 分钟,并且使用了大部分 RAM,导致系统阻塞。我知道每个组都会很小,每个组不超过 100 行(user_id, event_id)
tuple,所以我认为优化的执行可能会占用非常小的内存,而且速度也会更快(因为不需要循环组键)。
创建一个分桶排序表。优化器会知道它是根据元数据排序的。
请参阅此处的示例(官方文档):https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-BucketedSortedTables 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,并且仅计算 1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)