我有一个数据框
test = spark.createDataFrame([('bn', 12452, 221), ('mb', 14521, 330),('bn',2,220),('mb',14520,331)],['x','y','z'])
test.show()
我需要根据条件计算行数:
test.groupBy("x").agg(count(col("y")>12453),count(col("z")>230)).show()
给出了
+---+------------------+----------------+
| x|count((y > 12453))|count((z > 230))|
+---+------------------+----------------+
| bn| 2| 2|
| mb| 2| 2|
+---+------------------+----------------+
对于某些条件,它只是行数而不是行数。
答案 0 :(得分:11)
count
不会对 True 进行求和,它只计算非空值的数量。要计算 True 值,您需要将条件转换为1/0然后sum
:
import pyspark.sql.functions as F
cnt_cond = lambda cond: F.sum(F.when(cond, 1).otherwise(0))
test.groupBy('x').agg(
cnt_cond(F.col('y') > 12453).alias('y_cnt'),
cnt_cond(F.col('z') > 230).alias('z_cnt')
).show()
+---+-----+-----+
| x|y_cnt|z_cnt|
+---+-----+-----+
| bn| 0| 0|
| mb| 2| 2|
+---+-----+-----+
答案 1 :(得分:3)
基于@Psidom的答案,我的答案如下:
from pyspark.sql.functions import col,when,count
test.groupBy("x").agg(count(when((col("y")>12453),True)),count(when(col("z")>230,True))).show()