我在一个蜂巢表(数百亿行)上聚合 4 个维度,它们需要被卷起或立方。假设我的表是关于用户交互的,我将汇总他们使用的移动应用程序、他们拥有的移动操作系统等。 sql 如下所示:
select d1, d2, d3, d4, count(distinct userId) as uv, sum(1) as pv from T
group by cube(d1, d2, d3, d4)
由于当前的分组集/汇总/多维数据集实现会爆炸输入(根据此jira),导致总共 16 次通过输入,这非常消耗资源。
我对此的自定义解决方案是有一个临时表,我首先汇总用户 ID 和 4 个维度,然后进行汇总。
create table tmp as
select userId, d1, d2, d3, d4, sum(1) as pv from T
group by userId, d1, d2, d3, d4
然后
select d1, d2, d3, d4, count(1) as uv, sum(pv) as pv
from tmp
group by cube(d1, d2, d3, d4)
由于输入数据很大,因此进行预聚合会显着减少运行时间(减少 16 次传递的输入数据大小)。
所以我想知道 hive/spark 是否可以内置这个规则,或者人们通常会处理这个我不知道的问题?