0

我在一个蜂巢表(数百亿行)上聚合 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 是否可以内置这个规则,或者人们通常会处理这个我不知道的问题?

4

1 回答 1

0

不,Spark-SQL Catalyst 没有任何预聚合计算规则。这是因为 hcatalogue 和 spark-sql 目录都没有存储层次结构信息,这就是它现在不具备此功能的原因。

通常 OLAP 工具会提供此功能。它们存储层次结构详细信息,并基于层次结构计算 OLAP 多维数据集中的聚合。

如果您正在寻找 OLAP 功能,那么您可能应该探索SnowflakeKyvosinsights

于 2019-05-09T12:02:39.300 回答