Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Pyspark表中附加来自循环的聚合统计信息_Pyspark - Fatal编程技术网

在Pyspark表中附加来自循环的聚合统计信息

在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

我有以下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 = 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。我希望它会更简单。但是谢谢!