在pyspark中按组计数满足另一列上额外条件的元素

时间:2018-12-18 15:56:18

标签: python python-3.x pyspark

以下pyspark命令

df = dataFrame.groupBy("URL_short").count().select("URL_short", col("count").alias("NumOfReqs"))

创建了以下结果。

|URL_short |NumOfReqs|
+-----------------------------------------------------------------------------------------+---------+
|http1     | 500    |
|http4     | 500    |
|http2     | 500    |
|http3     | 500    |

在原始DataFrame dataFrame中,有一个名为success的列,其类型为text。该值可以是"true""false"

结果是,我想有一个名为NumOfSuccess的附加列,该列对每个类别"true"的原始列success中具有条目URL_short的元素进行计数。

如何修改

df = dataFrame.groupBy("URL_short").count().select("URL_short", col("count").alias("NumOfReqs"))

还要输出满足条件success ==“ true per URL_short`类别的列吗?

1 个答案:

答案 0 :(得分:1)

一种方法是添加另一个聚合表达式(还将count转换为agg表达式):

import pyspark.sql.functions as f

dataFrame.groupBy("URL_short").agg(
  f.count('*').alias('NumOfReqs'), 
  f.sum(f.when(f.col('success'), 1).otherwise(0)).alias('CountOfSuccess')
).show()

请注意,这假设您的success列为布尔型,如果为字符串,则将表达式更改为f.sum(f.when(f.col('success') == 'true', 1).otherwise(0)).alias('CountOfSuccess')