首页 > 解决方案 > 如何做聚合函数,可能列和提取回来

问题描述

在 spark-sql-2.4.1v 中,我有一个场景,我需要计算几个聚合给定的列列表,即感兴趣的列

我需要的每一列在相同的列分组上生成几个聚合。有什么方法可以一次性执行 group by 并取回这些聚合?

如果我一次做每个项目(即兴趣列),那么我需要多次按数据分组,这会花费大量时间。

假设我有

   columns_interestedList.stream().forEach( col_interested  -> {
         Dataset groupByResDs_col_interested  = dataDs.groupBy("grp_col_1","grp_col_1").agg(count((*).as("col_interested_count") , avg(col_interested  ).as(col_interested_avg)));
    }

    );

如上所示,我需要一次获取所有感兴趣的列聚合,怎么做(避免每个 col_interested 的分组)

一旦我完成所有列,如何取回它们,如下所示:

-----------------------------------------------------------------------------
col_interested_one      col_interested_one_count      col_interested_one_avg
col_interested_two      col_interested_two_count      col_interested_two_avg
col_interested_three    col_interested_three_count    col_interested_three_avg
------------------------------------------------------------------------------

标签: javaapache-sparkapache-spark-sql

解决方案


如果您要groupBy使用相同的列进行所有操作,并且想要创建所有聚合列引用,就像avg(col_interested ).as(col_interested_avg)所有元素一样,columns_interestedList您可以使用流创建所有引用,并将它们传递给 gag 方法。

List<Column> avgCols = columns_interestedList.stream()
.map(col_interested -> avg(col_interested).as(col_interested + "_avg"))
.collect(Collectors.toList());

dataDs.groupBy("grp_col_1","grp_col_1")
.agg(avgCols.add(count((*).as("col_interested_count").toArray(new Column[0]));

推荐阅读