关于window函数中f.count(f.col(“some column”).isnotnull())的用法

k4aesqcs  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(374)

我正在测试window函数中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() 处理这个。为什么会这样 2 前两排 xyz1 列。

jv2fixgn

jv2fixgn1#

如果计算布尔值,因为它们不是真的就是假的,那么将计算指定窗口中的所有行,而不管 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|
+----+----+----+----+

相关问题