Condividi tramite


Classe Window

Funzioni di utilità per la definizione della finestra nei dataframe.

Supporta Spark Connect

Attributi di classe

Attribute Descrizione
unboundedPreceding Valore limite che rappresenta l'inizio di una cornice di finestra non associato.
unboundedFollowing Valore limite che rappresenta la fine di una cornice di finestra non associato.
currentRow Valore limite che rappresenta la riga corrente in una cornice di finestra.

Methods

metodo Descrizione
orderBy(*cols) Crea un oggetto WindowSpec con l'ordinamento definito.
partitionBy(*cols) Crea un oggetto WindowSpec con il partizionamento definito.
rangeBetween(start, end) Crea un oggetto WindowSpec con i limiti di frame definiti, da start (inclusivo) a end (inclusivo), usando offset basati su intervalli dal valore della ORDER BY riga corrente.
rowsBetween(start, end) Crea un oggetto WindowSpec con i limiti di frame definiti, da start (inclusivo) a end (inclusivo), usando offset basati su righe dalla riga corrente.

Note

Quando l'ordinamento non è definito, per impostazione predefinita viene utilizzato un frame di finestra non associato (rowFrame, unboundedPrecedIng, unboundedFollowing). Quando viene definito l'ordinamento, per impostazione predefinita viene usato un frame di finestra in crescita (rangeFrame, unboundedPreceding, currentRow).

Examples

Finestra di base con ordinamento e cornice di riga

from pyspark.sql import Window

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

Finestra partizionata con frame di intervallo

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)

Numero di riga all'interno della partizione

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

Esecuzione della somma con frame basato su righe

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

Esecuzione della somma con frame basato su intervallo

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