我在蜂巢表(数百亿行(上汇总了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是否可以内置此规则,或者人们通常会处理这个问题,否则我不知道?
no,Spark-SQL催化剂没有任何预算的规则。这是因为Hcatalogue或Spark-SQL目录存储层次结构&那就是为什么它到目前为止没有这种功能。
通常会提供此功能。他们存储层次结构的详细信息并基于层次结构,它计算Olap Cube中的聚集体。
如果您正在寻找OLAP功能,那么您可能应该探索雪花或KyvoSinsights