关于 F.count(F.col("some column").isNotNull()) 在 window 函数中的用法

regarding the usage of F.count(F.col("some column").isNotNull()) in window function

我正在尝试测试 F.count(F.col().isNotNull()) 在 window 函数中的用法。请看下面的代码脚本

from pyspark.sql import functions as F
from pyspark.sql import SparkSession
from pyspark.sql.window import Window
spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()
list=([1,5,4],
    [1,5,None],
    [1,5,1],
    [1,5,4],
    [2,5,1],
    [2,5,2],
    [2,5,None],
    [2,5,None],
     [2,5,4])
df=spark.createDataFrame(list,['I_id','p_id','xyz'])
w= Window().partitionBy("I_id","p_id").orderBy(F.col("xyz").asc_nulls_first())
df.withColumn("xyz1",F.count(F.col("xyz").isNotNull()).over(w)).show()

结果如下图。前两行,我的理解是F.count(F.col("xyz")应该统计xyz = -infinityxyz = null的非零项,下面的isNotNull()是怎么处理的。为什么它在 xyz1 列的前两行得到 2

如果计算布尔值,因为它们为 True 或 False,您将计算指定 window 中的所有行,而不管 xyz 是否为 null。

你可以做的是 sum isNotNull 布尔值而不是计算它们。

df.withColumn("xyz1",F.sum(F.col("xyz").isNotNull().cast('int')).over(w)).show()
+----+----+----+----+
|I_id|p_id| xyz|xyz1|
+----+----+----+----+
|   2|   5|null|   0|
|   2|   5|null|   0|
|   2|   5|   1|   1|
|   2|   5|   2|   2|
|   2|   5|   4|   3|
|   1|   5|null|   0|
|   1|   5|   1|   1|
|   1|   5|   4|   3|
|   1|   5|   4|   3|
+----+----+----+----+

另一种方法是使用 when:

进行条件计数
df.withColumn("xyz1",F.count(F.when(F.col("xyz").isNotNull(), 1)).over(w)).show()
+----+----+----+----+
|I_id|p_id| xyz|xyz1|
+----+----+----+----+
|   2|   5|null|   0|
|   2|   5|null|   0|
|   2|   5|   1|   1|
|   2|   5|   2|   2|
|   2|   5|   4|   3|
|   1|   5|null|   0|
|   1|   5|   1|   1|
|   1|   5|   4|   3|
|   1|   5|   4|   3|
+----+----+----+----+