使用 pyspark 聚合另一列时,从单列中查找多个值的计数、通过和失败百分比

finding the count, pass and fail percentage of the multiple values from single column while aggregating another column using pyspark

数据

我想为 column1 应用 groupby 并想计算每个 1 的通过百分比和失败百分比以及计数

我正在寻找的示例输出

我正在使用 pyspark 执行以下代码,但我只得到百分比

 levels = ["passed", "failed","blocked"]

 exprs = [avg((col("Column2") == level).cast("double")*100).alias(level)
          for level in levels]
 df = sparkSession.read.json(hdfsPath)
 result1 = df1.select('Column1','Column2').groupBy("Column1").agg(*exprs)

您需要明确计算计数,然后进行一些字符串格式化以将计数中的百分比合并到一个列中。

from pyspark.sql.functions import avg, col, count, concat, lit

levels = ["passed", "failed","blocked"]

# percentage aggregations
pct_exprs = [avg((col("Column2") == level).cast("double")*100).alias('{}_pct'.format(level))
              for level in levels]
# count aggregations
count_exprs = [sum((col("Column2") == level).cast("int")).alias('{}_count'.format(level))
               for level in levels]
# combine all aggregations
exprs = pct_exprs + count_exprs

# string formatting select expressions
select_exprs = [
    concat(
        col('{}_pct'.format(level)).cast('string'),
        lit('('),
        col('{}_count'.format(level)).cast('string'),
        lit(')')
    ).alias('{}_viz'.format(level))
    for level in levels
]

df = sparkSession.read.json(hdfsPath)
result1 = (
    df1
    .select('Column1','Column2')
    .groupBy("Column1")
    .agg(*exprs)
    .select('Column1', *select_exprs)
)

注意:您似乎正在尝试使用 Spark 来很好地可视化计算结果,但我认为 Spark 不适合这项任务。如果您的记录足够少,可以一次看到所有记录,那么您不妨在 Pandas 或类似的地方工作。而且,如果您有足够多的记录,使用 Spark 是有意义的,那么无论如何您都无法一次看到所有这些记录,因此它们看起来是否漂亮并不重要。