在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中的窗口对象的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark SQL/SQL 中的窗口和聚合函数

在 Pyspark 中查找给定时间窗口中的行数

当窗口/分区使用前向填充时,向 pyspark sql 中的 last() 函数添加条件

在 PySpark 中的窗口上获取与某些条件匹配的第一行

PySpark 中的窗口函数和条件过滤器

使用窗口函数计算 PySpark 中的累积和