dataframe—聚合大多数为空的列的最佳spark查询计划

nkhmeac6  于 2021-05-17  发布在  Spark
关注(0)|答案(0)|浏览(319)

我有一个巨大的表(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。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题