我有一个巨大的表(10个tbs),有200列,其中150列是可聚合的(比如int/float/etc),剩下的50列是groupbys(或者breakdowns/dimensions)。
该表有3个分区:
p1—它包含所有具有非空可聚合值的150列和50个非空分组。
p2-它包含5个具有非null可聚合值的列,其余145个可聚合列为null,并且它还包含50个非null groupby。
p3—它包含5个列,这些列具有非空的可聚合值。148个可聚合列中的其余列为空,它还包含50个非空的groupby。
我需要跨所有3个分区运行预聚合:
SELECT sum(...), ... FROM table GROUP BY <group-bys>
以示说明
| c1 | c2 | c3 | country | location |
|----|-----|-----|---------|------------|
| 1 | 3.4 | 1.1 | US | Home |
| 2 | 2.2 | 3.3 | US | Office |
| 4 | 4.1 | 2.7 | UK | Party |
| 5 | 5.5 | 3.5 | US | Home |
Here c1, c2 and c3 are aggregatable metrics and (country, location) are group-bys
我可以想到两种可能的查询计划,我可以使用dataframe/dataset api编写。
方案1)
SELECT sum(...), ..150 columns... FROM (
SELECT sum(...), ..150 columns... FROM table WHERE partition=p1 GROUP BY <group-bys>
UNION ALL
SELECT sum(...), .., NULL AS .., ... FROM table WHERE partition=p2 GROUP BY <group-bys>
UNION ALL
SELECT sum(...), .., NULL AS .., ... FROM table WHERE partition=p2 GROUP BY <group-bys>
) GROUP BY <group-bys>
我不确定sparkcatalyst是否能够优化查询计划,并通过避免空列的无序排列来减少无序排列。空列有开销吗?
选项2)我创建3个Dataframe(对于每个分区)并只聚合相关的列。然后我可以基于groupbys列重新划分Dataframe。我现在只需要聚合来自df2和df3的5+1可聚合列。我不知道如何在最有效地使用dataframeapi(键值)dataframe中实现这一点?协同组?
所以我的问题有两个:
选项2是否更优化?或者spark在洗牌145个空列时没有任何开销。
如果选项2更理想,我应该使用什么dataframeapi来聚合3个列数不同的dataframes。
暂无答案!
目前还没有任何答案,快来回答吧!