在Pyspark表中附加来自循环的聚合统计信息
我有以下Pyspark代码。在循环中的每次迭代中,我过滤掉H列中具有特定字符串的所有行。然后我计算G列中的一些聚合统计数据,结果为3个值。我想将所有聚合计数保存在一个表行中:CM、NCM、FP;和列:POP、POP N、POP SN、POP QP在Pyspark表中附加来自循环的聚合统计信息,pyspark,Pyspark,我有以下Pyspark代码。在循环中的每次迭代中,我过滤掉H列中具有特定字符串的所有行。然后我计算G列中的一些聚合统计数据,结果为3个值。我想将所有聚合计数保存在一个表行中:CM、NCM、FP;和列:POP、POP N、POP SN、POP QP from pyspark.sql import SparkSession import pandas as pd import numpy as np import pyspark.sql.functions as F spark = SparkSe
from pyspark.sql import SparkSession
import pandas as pd
import numpy as np
import pyspark.sql.functions as F
spark = SparkSession.builder.master("local").appName("Word Count").config("spark.some.config.option", "some-value").getOrCreate()
np.random.seed(0)
rows = 1000
df_pandas = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(rows)),dtype='float32'),
'D' : np.array([3] * rows,dtype='int32'),
'E' : pd.Categorical(np.random.choice(["test","train","frog", "chicken"], rows)),
'F' : 'foo' ,
'G' : np.random.choice(['CM', 'NCM', 'FP'], rows),
'H' : np.random.choice(['POP', 'POP N', 'POP SN', 'POP QP'], rows)})
df_spark = spark.createDataFrame(df_pandas)
blocks = ['POP', 'POP N', 'POP SN', 'POP QP']
for block in blocks:
df_spark_trimmed = df_spark.filter(~F.col('H').isin(block))
counts = df_spark_trimmed.groupby('G').count()
counts.show()
使用连接:
导入pyspark.sql.F函数
count_by_g=df_spark.groupBy'g'。aggF.count'*'。别名'CountByG'
count_by_gh=df_spark.groupBy['G','H'].aggF.count'*'。别名'CountByGH'
按[g]计数。按[g]计数。选择EXPR
‘G’、‘H’、‘CountByG—CountByG作为计数’
.groupBy'G'。pivot'H'。aggF.max'count'。别名'count'。show
+--+--+---+---+---+
|G | POP | POP N | POP QP | POP序列号|
+--+--+---+---+---+
|厘米| 256 | 260 | 245 | 250|
|NCM | 265 | 254 | 248 | 262|
|FP | 246 | 236 | 239 | 239|
+--+--+---+---+---+
或其他具有窗口功能的解决方案:
df_spark.groupBy['G','H'].count.selectExpr
“G”,“H”,“分区上的sumcount by G-count as count”
.groupBy'G'。pivot'H'。aggF.max'count'。别名'count'。show
+--+--+---+---+---+
|G | POP | POP N | POP QP | POP序列号|
+--+--+---+---+---+
|厘米| 256 | 260 | 245 | 250|
|NCM | 265 | 254 | 248 | 262|
|FP | 246 | 236 | 239 | 239|
+--+--+---+---+---+
但这些数字是不正确的。我正在删除与字符串匹配的行,而不是选择与字符串匹配的行。请参阅更新-您基本上先计算总行数,然后再从中减去每个组的计数。嗯,结果与我上面的脚本生成的结果不同,例如,POP的计数应为:CM:256,NCM:265,FP:246。我认为应该从单列表中减去包含4列的透视表:totalCount=df_spark.groupBy'G'.count。但不知道如何减去不同列数的表…这比我想象的要复杂。更新了加入解决方案-我的word。我希望它会更简单。但是谢谢!