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

Dataframe 聚合大多数为空的列的最佳spark查询计划,dataframe,apache-spark,apache-spark-dataset,catalyst-optimizer,Dataframe,Apache Spark,Apache Spark Dataset,Catalyst Optimizer,我有一个巨大的TBs表10s,有200列,其中150列是可聚合的,如int/float/etc,其余50列是按分组或细分/维度 该表有3个分区: SELECT sum(...), ... FROM table GROUP BY <group-bys> P1-它包含所有具有非空可聚合值和50个非空group BY的150列 P2-它包含5个具有非null可聚合值的列,145个可聚合列中的其余列为null,并且它还包含50个非null group BY P3-它包含5个具有非null可

我有一个巨大的TBs表10s,有200列,其中150列是可聚合的,如int/float/etc,其余50列是按分组或细分/维度

该表有3个分区:

SELECT sum(...), ... FROM table GROUP BY <group-bys>
P1-它包含所有具有非空可聚合值和50个非空group BY的150列

P2-它包含5个具有非null可聚合值的列,145个可聚合列中的其余列为null,并且它还包含50个非null group BY

P3-它包含5个具有非null可聚合值的列,148个可聚合列中的其余列为null,并且它还包含50个非null group BY

我需要跨所有3个分区运行预聚合:

SELECT sum(...), ... FROM table GROUP BY <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>
我不确定spark catalyst是否能够优化查询计划,并通过避免空列的无序排列来减少无序排列。空列是否有任何开销

选择2 我为每个分区创建3个数据帧,并只聚合相关的列。然后,我可以基于GROUPBYS列重新划分数据帧。现在我只需要聚合来自df2和df3的5+1可聚合列。我不知道如何以最有效的方式使用DataFrameAPI,即键值dataframe来实现这一点?协同组

所以我的问题有两个:

选项2是否更优化?或者spark在混洗145个空列时没有任何开销。 如果选项2更为优化,那么我应该使用什么数据帧API来聚合具有不同列数的3个数据帧。