使用 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 是有意义的,那么无论如何您都无法一次看到所有这些记录,因此它们看起来是否漂亮并不重要。
数据
我想为 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 是有意义的,那么无论如何您都无法一次看到所有这些记录,因此它们看起来是否漂亮并不重要。