【问题标题】:Getting the Summary of Whole Dataset or Only Columns in Apache Spark Java在 Apache Spark Java 中获取整个数据集或仅列的摘要
【发布时间】:2018-03-05 07:42:25
【问题描述】:

对于下面的数据集,为了获得 Col1 的总摘要值,我做了

import org.apache.spark.sql.functions._
val totaldf = df.groupBy("Col1").agg(lit("Total").as("Col2"), sum("price").as("price"), sum("displayPrice").as("displayPrice"))

然后与

合并
df.union(totaldf).orderBy(col("Col1"), col("Col2").desc).show(false)

df.

+-----------+-------+--------+--------------+
|   Col1    | Col2  | price  | displayPrice |
+-----------+-------+--------+--------------+
| Category1 | item1 |     15 |           14 |
| Category1 | item2 |     11 |           10 |
| Category1 | item3 |     18 |           16 |
| Category2 | item1 |     15 |           14 |
| Category2 | item2 |     11 |           10 |
| Category2 | item3 |     18 |           16 |
+-----------+-------+--------+--------------+

合并后。

+-----------+-------+-------+--------------+
|   Col1    | Col2  | price | displayPrice |
+-----------+-------+-------+--------------+
| Category1 | Total |    44 |           40 |
| Category1 | item1 |    15 |           14 |
| Category1 | item2 |    11 |           10 |
| Category1 | item3 |    18 |           16 |
| Category2 | Total |    46 |           44 |
| Category2 | item1 |    16 |           15 |
| Category2 | item2 |    11 |           10 |
| Category2 | item3 |    19 |           17 |
+-----------+-------+-------+--------------+

现在我想要整个数据集的摘要如下,它将 Col1 摘要作为总计,并具有所有 Col1 和 Col2 的数据。 必填。

    +-----------+-------+-------+--------------+
    |   Col1    | Col2  | price | displayPrice |
    +-----------+-------+-------+--------------+
    | Total     | Total |    90 |           84 |
    | Category1 | Total |    44 |           40 |
    | Category1 | item1 |    15 |           14 |
    | Category1 | item2 |    11 |           10 |
    | Category1 | item3 |    18 |           16 |
    | Category2 | Total |    46 |           44 |
    | Category2 | item1 |    16 |           15 |
    | Category2 | item2 |    11 |           10 |
    | Category2 | item3 |    19 |           17 |
    +-----------+-------+-------+--------------+

我怎样才能达到上述结果?

【问题讨论】:

    标签: apache-spark apache-spark-sql apache-spark-dataset


    【解决方案1】:

    totaldf 创建第三个​​数据帧

    val finalTotalDF= totaldf.select(lit("Total").as("Col1"), lit("Total").as("Col2"), sum("price").as("price"), sum("displayPrice").as("displayPrice"))
    

    然后将其用于union as

    df.union(totaldf).union(finalTotalDF).orderBy(col("Col1"), col("Col2").desc).show(false)
    

    你应该有你的finaldataframe

    更新

    如果订购对您很重要,那么您应该通过执行以下操作将Col2 列中的TTotal 更改为ttotal

    import org.apache.spark.sql.functions._
    val totaldf = df.groupBy("Col1").agg(lit("total").as("Col2"), sum("price").as("price"), sum("displayPrice").as("displayPrice"))
    val finalTotalDF= totaldf.select(lit("Total").as("Col1"), lit("total").as("Col2"), sum("price").as("price"), sum("displayPrice").as("displayPrice"))
    df.union(totaldf).union(finalTotalDF).orderBy(col("Col1").desc, col("Col2").desc).show(false)
    

    你应该得到

    +---------+-----+-----+------------+
    |Col1     |Col2 |price|displayPrice|
    +---------+-----+-----+------------+
    |Total    |total|90   |82          |
    |Category2|total|46   |42          |
    |Category2|item3|19   |17          |
    |Category2|item2|11   |10          |
    |Category2|item1|16   |15          |
    |Category1|total|44   |40          |
    |Category1|item3|18   |16          |
    |Category1|item2|11   |10          |
    |Category1|item1|15   |14          |
    +---------+-----+-----+------------+
    

    如果评论中提到的订购对您来说真的很重要

    我希望总数据优先,所以我希望它在顶部,这实际上是对我的要求

    然后你可以创建另一列排序为

    import org.apache.spark.sql.functions._
    val totaldf = df.groupBy("Col1").agg(lit("Total").as("Col2"), sum("price").as("price"), sum("displayPrice").as("displayPrice"), lit(1).as("sort"))
    val finalTotalDF= totaldf.select(lit("Total").as("Col1"), lit("Total").as("Col2"), sum("price").as("price"), sum("displayPrice").as("displayPrice"), lit(0).as("sort"))
    finalTotalDF.union(totaldf).union(df.withColumn("sort", lit(2))).orderBy(col("sort"), col("Col1"), col("Col2")).drop("sort").show(false)
    

    你应该得到

    +---------+-----+-----+------------+
    |Col1     |Col2 |price|displayPrice|
    +---------+-----+-----+------------+
    |Total    |Total|90   |82          |
    |Category1|Total|44   |40          |
    |Category2|Total|46   |42          |
    |Category1|item1|15   |14          |
    |Category1|item2|11   |10          |
    |Category1|item3|18   |16          |
    |Category2|item1|16   |15          |
    |Category2|item2|11   |10          |
    |Category2|item3|19   |17          |
    +---------+-----+-----+------------+
    

    【讨论】:

    • 好的,但是 Total 应该总是在最前面
    • Ramesh,我将如何在 Col1 中获得 Total,我们没有为 Column 做任何事情,您可以考虑一次所需的数据集,建议的答案与我们为 Col2 所做的相同吗? val totaldf = df.groupBy("Col1").agg(lit("Total").as("Col2"),sum("price").as("price"), sum("displayPrice").as("displayPrice"))
    • 好的,让我试试这个。谢谢:)
    • 最后一次更新肯定对你有用:) 最后我也测试了@Aymarharsh
    • 它的作品 Ramesh,但为了满足我的要求,我希望仅在顶部其余部分的总计应该是升序排序 @Ramesh,如果你能帮我解决这个问题,那就太好了
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多