专栏总结(在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 |
+-------+--------+------+-------+
对于以下数据集,我需要根据所选列获取摘要数据示例数据集包含以下数据。
+---------+----------+--------+---------+
| 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 |
+-------+--------+------+-------+