数据
我想对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)
答案 0 :(得分:1)
您需要显式计算计数,然后执行一些字符串格式化以将计数中的百分比合并为一列。
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是有意义的,那么你无论如何也无法立刻看到它们,所以它们看起来不错也无关紧要。