我正在一个蜂巢表(数百亿行)上汇总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遍的输入数据量)。
所以我想知道蜂巢/火花是否可以内置此规则,否则人们通常会处理这个问题,否则我不会意识到?
答案 0 :(得分:0)
否,Spark-SQL Catalyst没有用于预聚合计算的任何规则。 这是因为hcatalogue和spark-sql目录都没有存储层次结构信息,这就是为什么它到目前为止没有此功能的原因。
通常,OLAP工具提供此功能。他们存储层次结构详细信息,并基于层次结构计算OLAP多维数据集中的聚合。
如果您正在寻找OLAP功能,那么您可能应该探索Snowflake或Kyvosinsights