我有以下Pyspark代码。在循环的每次迭代中,我都会在H列中过滤出包含特定字符串的所有行。然后在G列中计算一些汇总统计信息(得出3个值)。我想将所有汇总计数保存在一个表中(行:CM,NCM,FP;列:POP,POP N,POP SN,POP QP)。
oc
答案 0 :(得分:1)
使用join
:
import pyspark.sql.functions as F
count_by_g = df_spark.groupBy('G').agg(F.count('*').alias('CountByG'))
count_by_gh = df_spark.groupBy(['G', 'H']).agg(F.count('*').alias('CountByGH'))
count_by_g.join(count_by_gh, ['G']).selectExpr(
'G', 'H', 'CountByG - CountByGH as count'
).groupBy('G').pivot('H').agg(F.max('count').alias('count')).show()
+---+---+-----+------+------+
| G|POP|POP N|POP QP|POP SN|
+---+---+-----+------+------+
| CM|256| 260| 245| 250|
|NCM|265| 254| 248| 262|
| FP|246| 236| 239| 239|
+---+---+-----+------+------+
或具有窗口功能的其他解决方案:
df_spark.groupBy(['G', 'H']).count().selectExpr(
'G', 'H', 'sum(count) over (partition by G) - count as count'
).groupBy('G').pivot('H').agg(F.max('count').alias('count')).show()
+---+---+-----+------+------+
| G|POP|POP N|POP QP|POP SN|
+---+---+-----+------+------+
| CM|256| 260| 245| 250|
|NCM|265| 254| 248| 262|
| FP|246| 236| 239| 239|
+---+---+-----+------+------+