pyspark计算条件的行

new*_*eaf 9 count pyspark

我有一个数据帧

test = spark.createDataFrame([('bn', 12452, 221), ('mb', 14521, 330),('bn',2,220),('mb',14520,331)],['x','y','z'])
test.show()
Run Code Online (Sandbox Code Playgroud)

我需要根据条件计算行数:

test.groupBy("x").agg(count(col("y")>12453),count(col("z")>230)).show()
Run Code Online (Sandbox Code Playgroud)

这使

 +---+------------------+----------------+
 |  x|count((y > 12453))|count((z > 230))|
 +---+------------------+----------------+
 | bn|                 2|               2|
 | mb|                 2|               2|
 +---+------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

对于某些条件,它只是行的计数而不是行的计数.

Psi*_*dom 22

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|
+---+-----+-----+
Run Code Online (Sandbox Code Playgroud)

  • 我可以在这里检查我对 pyspark 的理解吗:这里的 lambda 函数全部在 Spark 中,因此永远不必创建用户定义的 python 函数,从而带来相关的减慢。正确的?这看起来非常方便。 (2认同)

new*_*eaf 8

基于@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()
Run Code Online (Sandbox Code Playgroud)