专栏总结(在Spark数据集上实现Cube功能)

Summary of a Column (Achieving a Cube Function on Spark Dataset)

对于以下数据集,我需要根据所选列获取摘要数据示例数据集包含以下数据。

+---------+----------+--------+---------+
| Column1 | Column2  | Expend | Expend2 |
+---------+----------+--------+---------+
| School1 | Student1 | 5      | 10      |
+---------+----------+--------+---------+
| School1 | Student2 | 11     | 12      |
+---------+----------+--------+---------+
| School2 | Student1 | 6      | 8       |
+---------+----------+--------+---------+
| School2 | Student2 | 7      | 8       |
+---------+----------+--------+---------+

我需要获取 Column2 的摘要数据,如下所示,

要求格式

+---------+----------+--------+---------+
| Column1 | Column2  | Expend | Expend2 |
+---------+----------+--------+---------+
| School1 | Total    | 16     | 22      |
+---------+----------+--------+---------+
| School1 | Student1 | 5      | 10      |
+---------+----------+--------+---------+
| School1 | Student2 | 11     | 12      |
+---------+----------+--------+---------+
| School2 | Total    | 13     | 16      |
+---------+----------+--------+---------+
| School2 | Student1 | 6      | 8       |
+---------+----------+--------+---------+
| School2 | Student2 | 7      | 8       |
+---------+----------+--------+---------+

我尝试在数据集上使用立方体函数,但这没有给我预期的结果。 我得到 null 值代替 Total 这也可以,但是我没有得到上述格式的数据。

我想尝试使用 dataset.cube("Column2").agg(sum("Expend1"),sum("Expend2"));

但是上面这行代码只给我 Column2 的数据,我怎样才能用上面的 return 数据检索 Column1 值。

从现有的 dataframe 中,您可以创建一个 total dataframe,其中 groupBy Column1将所有 Expend 列相加

import org.apache.spark.sql.functions._
val totaldf = df.groupBy("Column1").agg(lit("Total").as("Column2"), sum("Expend").as("Expend"), sum("Expend2").as("Expend2"))

然后你 merge 他们

df.union(totaldf).orderBy(col("Column1"), col("Column2").desc).show(false)

你应该有你想要的输出

+-------+--------+------+-------+
|Column1|Column2 |Expend|Expend2|
+-------+--------+------+-------+
|School1|Total   |16.0  |22.0   |
|School1|Student2|11    |12     |
|School1|Student1|5     |10     |
|School2|Total   |13.0  |16.0   |
|School2|Student2|7     |8      |
|School2|Student1|6     |8      |
+-------+--------+------+-------+