Dela via


Fönsterklass

Verktygsfunktioner för att definiera fönster i DataFrames.

Stöder Spark Connect

Klassattribut

Attribute Beskrivning
unboundedPreceding Gränsvärde som representerar början av en obundna fönsterram.
unboundedFollowing Gränsvärde som representerar slutet på en obundna fönsterram.
currentRow Gränsvärde som representerar den aktuella raden i en fönsterram.

Methods

Metod Beskrivning
orderBy(*cols) Skapar en WindowSpec med den definierade ordningen.
partitionBy(*cols) Skapar en WindowSpec med partitioneringen definierad.
rangeBetween(start, end) Skapar en WindowSpec med de definierade ramgränserna, från start (inkluderande) till end (inkluderande), med intervallbaserade förskjutningar från den aktuella radens ORDER BY värde.
rowsBetween(start, end) Skapar en WindowSpec med de ramgränser som definierats, från start (inkluderande) till end (inkluderande) med hjälp av radbaserade förskjutningar från den aktuella raden.

Notes

När beställningen inte har definierats används en obundet fönsterram (rowFrame, unboundedPreceding, unboundedFollowing) som standard. När beställning definieras används en växande fönsterram (rangeFrame, unboundedPreceding, currentRow) som standard.

Exempel

Basic-fönster med ordning och radram

from pyspark.sql import Window

# ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
window = Window.orderBy("date").rowsBetween(Window.unboundedPreceding, Window.currentRow)

Partitionerat fönster med intervallram

from pyspark.sql import Window

# PARTITION BY country ORDER BY date RANGE BETWEEN 3 PRECEDING AND 3 FOLLOWING
window = Window.orderBy("date").partitionBy("country").rangeBetween(-3, 3)

Radnummer inom partition

from pyspark.sql import Window, functions as sf

df = spark.createDataFrame(
    [(1, "a"), (1, "a"), (2, "a"), (1, "b"), (2, "b"), (3, "b")], ["id", "category"]
)

# Show row number ordered by id within each category partition
window = Window.partitionBy("category").orderBy("id")
df.withColumn("row_number", sf.row_number().over(window)).show()

Löpande summa med radbaserad ram

from pyspark.sql import Window, functions as sf

df = spark.createDataFrame(
    [(1, "a"), (1, "a"), (2, "a"), (1, "b"), (2, "b"), (3, "b")], ["id", "category"]
)

# Sum id values from the current row to the next row within each partition
window = Window.partitionBy("category").orderBy("id").rowsBetween(Window.currentRow, 1)
df.withColumn("sum", sf.sum("id").over(window)).sort("id", "category", "sum").show()

Löpande summa med intervallbaserad ram

from pyspark.sql import Window, functions as sf

df = spark.createDataFrame(
    [(1, "a"), (1, "a"), (2, "a"), (1, "b"), (2, "b"), (3, "b")], ["id", "category"]
)

# Sum id values from the current id value to id + 1 within each partition
window = Window.partitionBy("category").orderBy("id").rangeBetween(Window.currentRow, 1)
df.withColumn("sum", sf.sum("id").over(window)).sort("id", "category").show()