我在一个配置单元表(数百亿行)上聚合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)
因为当前的grouping sets/rollup/cube实现分解了输入(根据这个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是否可以内置这个规则,或者人们通常会处理这个问题,否则我就不知道了?
1条答案
按热度按时间wmomyfyw1#
不,spark sql catalyst没有任何预聚集计算规则。这是因为hcatalogue和sparksql目录都不存储层次结构信息&这就是为什么到目前为止它还没有这个功能。
通常olap工具提供了这个功能。它们存储层次结构细节,并根据层次结构计算olap多维数据集中的聚合。
如果您正在寻找olap功能,那么您可能应该探索snowflake或kyvosinsights