从Pyspark表中的循环追加汇总统计信息

时间:2018-10-28 20:02:27

标签: pyspark

我有以下Pyspark代码。在循环的每次迭代中,我都会在H列中过滤出包含特定字符串的所有行。然后在G列中计算一些汇总统计信息(得出3个值)。我想将所有汇总计数保存在一个表中(行:CM,NCM,FP;列:POP,POP N,POP SN,POP QP)。

oc

1 个答案:

答案 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|
+---+---+-----+------+------+