我们可以做汇总或多维数据集而不爆炸蜂巢/火花中的行吗

时间:2019-05-09 06:39:15

标签: apache-spark hive rollup grouping-sets

我正在一个蜂巢表(数百亿行)上汇总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遍的输入数据量)。

所以我想知道蜂巢/火花是否可以内置此规则,否则人们通常会处理这个问题,否则我不会意识到?

1 个答案:

答案 0 :(得分:0)

否,Spark-SQL Catalyst没有用于预聚合计算的任何规则。 这是因为hcatalogue和spark-sql目录都没有存储层次结构信息,这就是为什么它到目前为止没有此功能的原因。

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

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