【发布时间】:2016-12-20 17:15:48
【问题描述】:
我有以下(非常简单的)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 行,所以我认为优化的执行可能会占用非常小的内存并且速度更快(因为不需要循环组键)。
【问题讨论】:
-
附带说明,
count(interaction == 1)没有按我的预期工作,只计算具有 1 的行,而是返回与count(*)相同的行。 -
是的。聚合函数,包括 COUNT,忽略(仅)NULL 值并且 FALSE 不是 NULL
标签: sql hadoop hive query-optimization hiveql