在pyspark中的窗口对象

时间:2017-12-26 10:36:59

标签: pyspark window

如果我定义一个这样的窗口对象:

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"))

1 个答案:

答案 0 :(得分:1)

在多个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|
+---+---+---+---+---+