GroupBy和Aggregate函数在JAVA spark数据集中

时间:2018-01-04 10:20:14

标签: java apache-spark group-by aggregate-functions

我正在尝试在数据集上进行以下操作,以进行分组并聚合列总计以进行累加。但是,对于RelationalGroupedDataset而言,这并不适用于正常的数据集。如何在Normal数据集中实现以下操作

dataset.select.(col("col1"),col("col2"),col("expend")).groupBy(col("col1"),col("col2"),col("expend")).agg(sum("expend"))

SQL查询看起来像 select col1,col2,SUM(expend) from table group by col1,col2

尝试此代码时,列会重复出现。 dataset.columns()给了我[col1,col2,expend,expend]是接近的方式吗?

2 个答案:

答案 0 :(得分:0)

我用下面的代码解决了这个问题。 创建了一个列表List<Column> aggCols; 这将具有列的操作。 在这里,我添加为

aggCols.add(expr("sum(expend1)"));
addCols.add(expr("sum(expend2)"));

 dataset.select.(col("col1"),col("col2"),col("expend"))
.groupBy(col("col1"),col("col2"))
.agg(aggCols.get(0), JavaConverters.asScalaIteratorConverter(aggCols.subList(1,aggCols.size()).iterator()).asScala().toSeq());

当我只有一个列的总和时,我添加了一些检查,然后直接进行了总和。

答案 1 :(得分:-1)

如果您尝试按两列分组并agg这些值,那么您可以按以下方式进行分组

import org.apache.spark.sql.functions._
val data = Seq(
  ("item1","item2",4,4),
  ("item1","item2",5,5)
).toDF("col1", "col2", "expend1", "expend2")

data.groupBy("col1", "col2").agg(sum("expend1"), sum("expend2")).show(false)

输出:

+-----+-----+------------+------------+
|col1 |col2 |sum(expend1)|sum(expend2)|
+-----+-----+------------+------------+
|item1|item2|9           |9           |
+-----+-----+------------+------------+

希望这有帮助!