J'ai un dataframe
test = spark.createDataFrame([('bn', 12452, 221), ('mb', 14521, 330),('bn',2,220),('mb',14520,331)],['x','y','z'])
test.show()
J'ai besoin de compter les lignes en fonction d'une condition:
test.groupBy("x").agg(count(col("y")>12453),count(col("z")>230)).show()
qui donne
+---+------------------+----------------+
| x|count((y > 12453))|count((z > 230))|
+---+------------------+----------------+
| bn| 2| 2|
| mb| 2| 2|
+---+------------------+----------------+
C'est juste le nombre de lignes et non les lignes pour certaines conditions.
count
ne fait pas la somme True s, il ne compte que le nombre de valeurs non nulles. Pour compter les valeurs True, vous devez convertir les conditions en 1/0 puis 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|
+---+-----+-----+
Sur la base de la réponse @Psidom, ma réponse est la suivante
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()