关于窗口函数中 F.count(F.col("some column").isNotNull()) 的使用

Posted

技术标签:

【中文标题】关于窗口函数中 F.count(F.col("some column").isNotNull()) 的使用【英文标题】:regarding the usage of F.count(F.col("some column").isNotNull()) in window function 【发布时间】:2021-04-03 02:28:09 【问题描述】:

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

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

【问题讨论】:

xyz 列的值 None 与 null 不同。 isNotNull 函数将检查 null,这就是为什么它为 xyz1 列提供 2 的原因,因为您的示例数据中有两行具有 None 值。 【参考方案1】:

如果你计算布尔值,因为它们要么是真要么是假,你将计算指定窗口中的所有行,不管xyz是否为空。

您可以做的是 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|
+----+----+----+----+

【讨论】:

以上是关于关于窗口函数中 F.count(F.col("some column").isNotNull()) 的使用的主要内容,如果未能解决你的问题,请参考以下文章

在pyspark中的窗口对象

用js window.open在新窗口中打开链接,关于设置URL地址设置为变量的问题

在pyspark中计算窗口上列的百分位数

windowsAPI里面的ShowWindow函数怎么用?主要是关于窗口激活的用法。

hive关于窗口函数的使用

笨办法学Python:函数和文件