我们可以在 hive/spark 中不分解行的情况下进行汇总或立方体吗?

Can we do rollup or cube without exploding rows in hive/spark

我在一个配置单元 table(数百亿行)上聚合了 4 个维度,它们需要被卷起或立方。假设我的 table 是关于用户交互的,我将汇总他们使用的移动应用程序、他们拥有的移动设备 os 等。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 次传递,这非常耗费资源。

我的自定义解决方案是有一个临时的 table,我首先聚合用户 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 是否可以内置此规则,或者人们通常会处理这个问题,否则我不知道?

不,Spark-SQL Catalyst 没有任何 Pre-Aggregates 计算规则。 这是因为 hcatalogue 和 spark-sql catalog 都不存储层次结构信息,这就是为什么它现在没有此功能的原因。

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

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