了解窗口函数示例

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

我运行了一个代码脚本来得到以下结果。代码如下所示。我不明白为什么我得到了 xyz1 列,如图所示。例如,为什么第一排 xyz10 . 根据windows函数,它对应的组应该是前两行,但是为什么呢 F.count(F.col("xyz")).over(w) 得到 0 在这里。

import pyspark
from pyspark.sql import SparkSession
from pyspark.sql.window import Window
from pyspark.sql import functions as F
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"))
df.withColumn("xyz1",F.count(F.col("xyz")).over(w)).show()

svgewumm

svgewumm1#

请注意 count 仅统计非空项,并且分组仅由 partitionBy 子句,但不是 orderBy 条款。
指定排序列时,默认窗口范围为(根据文档)

(rangeFrame, unboundedPreceding, currentRow)

所以你的窗口定义实际上是

w = (Window().partitionBy("I_id","p_id")
             .orderBy(F.col("xyz"))
             .rangeBetween(Window.unboundedPreceding, Window.currentRow)
    )

所以窗口只包含 xyz = -infinity 价值 xyz 在当前行中。这就是为什么第一行的计数为零,因为它从 xyz = -infinityxyz = null ,即Dataframe的前两行。
在哪一排 xyz = 2 ,该计数包括来自 xyz = -infinityxyz = 2 ,即前四行。这就是为什么计数为2,因为非空项是1和2。

相关问题