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

时间:2018-06-16 07:41:55

标签: pyspark hdfs pyspark-sql

数据

Data

我想对column1应用groupby,并希望计算每个1的传递百分比和失败百分比,以及计数

示例输出我正在寻找

Result

使用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)

1 个答案:

答案 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是有意义的,那么你无论如何也无法立刻看到它们,所以它们看起来不错也无关紧要。