关于窗口函数中 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 = -infinity
到xyz = 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()) 的使用的主要内容,如果未能解决你的问题,请参考以下文章
用js window.open在新窗口中打开链接,关于设置URL地址设置为变量的问题