如果我定义一个这样的窗口对象:
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"))
答案 0 :(得分:1)
在多个orderBy()
调用中,上一个orderBy
会覆盖以前称为orderBy
的所有内容。所以回答你的问题 - 这将是
Window().partitionBy("HUB_ID").orderBy(F.col("Primary"))
使用以下3个用例可以更好地说明:
a
(升序)排序,然后b
(升序),请尝试此示例。orderBy()
两次(或多次),则会将最后一次通话视为最终通话。因此,在此示例中,它仅按列b
排序'。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|
+---+---+---+---+---+