在pyspark中的窗口对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在pyspark中的窗口对象相关的知识,希望对你有一定的参考价值。
如果我定义一个这样的窗口对象:
w_score = Window().partitionBy("HUB_ID").orderBy(F.col("coefficient").desc(), F.col("LastUpdateDate").desc())
另一个,像这样:
w_score_prim = w_score.orderBy(F.col("Primary"))
新的对象,w_score_prim
相当于哪一个? :
Window().partitionBy("HUB_ID").orderBy(F.col("coefficient").desc(), F.col("LastUpdateDate").desc(), F.col("Primary"))
or
Window().partitionBy("HUB_ID").orderBy(F.col("Primary"))
答案
在多个orderBy()
调用,最后orderBy
覆盖所有以前称为orderBy
。所以回答你的问题 - 就是这样
Window().partitionBy("HUB_ID").orderBy(F.col("Primary"))
使用以下3个用例可以更好地说明:
- 案例1:如果您想按列
a
(升序)和b
(升序)进行排序,请尝试此示例。 - 情况2:如果你两次(或多次)调用
orderBy()
,那么它会将最后一次调用视为最终的调用。因此,在此示例中,它按b
列'仅'排序。 - 案例3:此处发生相同(如案例2)。它按列
b
排序,并忽略了列a
排序。
import pyspark.sql.functions as f
from pyspark.sql.window import Window
df = sc.parallelize([
[1, 3, 1, 10],
[1, 0, 2, 20],
[3, 2, 3, 30],
[2, 1, 6, 40],
[2, 1, 4, 50],
[2, 2, 5, 60]
]).toDF(('id', 'a', 'b', 'val'))
#case 1
w = Window.partitionBy().partitionBy("id").orderBy(f.col("a"), f.col("b"))
df1 = df.withColumn("c", f.sum(f.col("val")).over(w))
df1.show()
#case 2
w_2 = Window.partitionBy().partitionBy("id").orderBy(f.col("a")).orderBy(f.col("b"))
df2 = df.withColumn("c", f.sum(f.col("val")).over(w_2))
df2.show()
#case 3
w_3 = Window.partitionBy().partitionBy("id").orderBy(f.col("a"))
w_3 = w_3.orderBy("b")
df3 = df.withColumn("c", f.sum(f.col("val")).over(w_3))
df3.show()
输出是:
+---+---+---+---+---+
| id| a| b|val| c|
+---+---+---+---+---+
| 1| 0| 2| 20| 20|
| 1| 3| 1| 10| 30|
| 3| 2| 3| 30| 30|
| 2| 1| 4| 50| 50|
| 2| 1| 6| 40| 90|
| 2| 2| 5| 60|150|
+---+---+---+---+---+
+---+---+---+---+---+
| id| a| b|val| c|
+---+---+---+---+---+
| 1| 3| 1| 10| 10|
| 1| 0| 2| 20| 30|
| 3| 2| 3| 30| 30|
| 2| 1| 4| 50| 50|
| 2| 2| 5| 60|110|
| 2| 1| 6| 40|150|
+---+---+---+---+---+
+---+---+---+---+---+
| id| a| b|val| c|
+---+---+---+---+---+
| 1| 3| 1| 10| 10|
| 1| 0| 2| 20| 30|
| 3| 2| 3| 30| 30|
| 2| 1| 4| 50| 50|
| 2| 2| 5| 60|110|
| 2| 1| 6| 40|150|
+---+---+---+---+---+
以上是关于在pyspark中的窗口对象的主要内容,如果未能解决你的问题,请参考以下文章