Java 如何做聚合函数,可以列和提取回来

Java 如何做聚合函数,可以列和提取回来,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,在spark-sql-2.4.1v中,我有一个场景,在这个场景中,我需要计算给定列列表中的几个聚合列,即感兴趣的列 我需要的每个列在同一个按列分组上生成几个聚合。 有没有办法一次一组地完成任务,并把那些伤害恢复过来 如果我一次完成每个项目,即兴趣列,那么我需要多次按数据分组,这需要花费大量时间 假设我有 columns_interestedList.stream().forEach( col_interested -> { Dataset groupByResDs

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

我需要的每个列在同一个按列分组上生成几个聚合。 有没有办法一次一组地完成任务,并把那些伤害恢复过来

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

假设我有

   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)));
    }

    );
如上所示,我需要一次获取所有感兴趣的列聚合,如何避免对每个感兴趣的列进行分组

完成所有列后,如何按如下方式取回它们:


如果要使所有groupBy具有相同的列,并且希望创建所有聚合列引用作为avgcol\u interest.ascol\u interest\u avg和列的所有元素\u 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]));

您希望每个平均值都在一行中,并带有获得该平均值的列的名称。计数将始终返回相同的值。另外,在您的示例中,您没有进行聚合的列的值,对吗?请举一个输入、输出和列列表的更好示例
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]));