在 PySpark DataFrame 中将汇总输出添加为新行

Add output of rollup as a new row in a PySpark DataFrame

我正在将 sql 代码转换为 Pyspark。

sql 代码使用汇总来汇总每个州的计数。

我正在尝试在 pyspark 中做同样的事情,但不知道如何获取总计数行。

我有一个包含州、城市和计数的 table,我想在州部分的末尾添加每个州的总计数。

这是示例输入:

State   City      Count
WA      Seattle    10
WA      Tacoma     11
MA      Boston     11
MA      Cambridge  3
MA      Quincy     5

这是我想要的输出:

State   City       Count
 WA     Seattle    10
 WA     Tacoma     11
 WA     Total      21
 MA     Boston     11
 MA     Cambridge  3
 MA     Quincy     5
 MA     Total      19

我不知道如何添加状态之间的总数。

我试过汇总,这是我的代码:

df2=df.rollup('STATE').count()

结果显示如下:

State  Count
 WA     21
 MA     19

但我想要每个州之后的总计。

或者:

df.groubpBy("State", "City").rollup(count("*"))

或者直接注册 table:

df.createOrReplaceTempView("df")

并应用您当前的 SQL 查询

spark.sql("...")

由于您希望 Total 作为 DataFrame 中的新行,一种选择是合并 groupBy() 的结果并按 ["State", "City", "Count"] 排序(以确保 "Total" 行显示在每个组的最后):

import pyspark.sql.functions as f
df.union(
    df.groupBy("State")\
    .agg(f.sum("Count").alias("Count"))\
    .select("State", f.lit("Total").alias("City"), "Count")
).sort("State", "City", "Count").show()
#+-----+---------+-----+
#|State|     City|Count|
#+-----+---------+-----+
#|   MA|   Boston|   11|
#|   MA|Cambridge|    3|
#|   MA|   Quincy|    5|
#|   MA|    Total|   19|
#|   WA|  Seattle|   10|
#|   WA|   Tacoma|   11|
#|   WA|    Total|   21|
#+-----+---------+-----+