了解 window 函数的示例
Understanding an example of window function
我是运行一个代码脚本得到了下面的结果。代码如下所示。我不明白为什么我得到如图所示的 xyz1
列。比如为什么第一行xyz1
是0
。根据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()
请注意,count
仅计算非空项,并且分组仅由 partitionBy
子句定义,而不是 orderBy
子句。
当您指定排序列时,默认的 window 范围是(根据 docs)
(rangeFrame, unboundedPreceding, currentRow)
所以你的window定义实际上是
w = (Window().partitionBy("I_id","p_id")
.orderBy(F.col("xyz"))
.rangeBetween(Window.unboundedPreceding, Window.currentRow)
)
因此 window 仅包含当前行中从 xyz = -infinity
到 xyz
的值的行。这就是为什么第一行的计数为零,因为它计算了从 xyz = -infinity
到 xyz = null
的非空项,即数据帧的前两行。
对于 xyz = 2
所在的行,计数包括从 xyz = -infinity
到 xyz = 2
的非空项,即前四行。这就是为什么你的计数是 2,因为非空项是 1 和 2。
我是运行一个代码脚本得到了下面的结果。代码如下所示。我不明白为什么我得到如图所示的 xyz1
列。比如为什么第一行xyz1
是0
。根据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()
请注意,count
仅计算非空项,并且分组仅由 partitionBy
子句定义,而不是 orderBy
子句。
当您指定排序列时,默认的 window 范围是(根据 docs)
(rangeFrame, unboundedPreceding, currentRow)
所以你的window定义实际上是
w = (Window().partitionBy("I_id","p_id")
.orderBy(F.col("xyz"))
.rangeBetween(Window.unboundedPreceding, Window.currentRow)
)
因此 window 仅包含当前行中从 xyz = -infinity
到 xyz
的值的行。这就是为什么第一行的计数为零,因为它计算了从 xyz = -infinity
到 xyz = null
的非空项,即数据帧的前两行。
对于 xyz = 2
所在的行,计数包括从 xyz = -infinity
到 xyz = 2
的非空项,即前四行。这就是为什么你的计数是 2,因为非空项是 1 和 2。