Freigeben über


Window-Klasse

Hilfsfunktionen zum Definieren des Fensters in DataFrames.

Unterstützt Spark Connect

Klassenattribute

Merkmal Beschreibung
unboundedPreceding Grenzwert, der den Anfang eines ungebundenen Fensterrahmens darstellt.
unboundedFollowing Grenzwert, der das Ende eines ungebundenen Fensterrahmens darstellt.
currentRow Grenzwert, der die aktuelle Zeile in einem Fensterrahmen darstellt.

Methodik

Methode Beschreibung
orderBy(*cols) Erstellt eine WindowSpec mit der definierten Sortierung.
partitionBy(*cols) Erstellt eine WindowSpec mit der definierten Partitionierung.
rangeBetween(start, end) Erstellt eine WindowSpec mit den definierten Rahmengrenzen von start (einschließlich) bis end (einschließlich) mithilfe von bereichsbasierten Offsets aus dem Wert der aktuellen Zeile ORDER BY .
rowsBetween(start, end) Erstellt eine WindowSpec mit den definierten Rahmengrenzen von start (einschließlich) bis end (einschließlich) mithilfe von zeilenbasierten Offsets aus der aktuellen Zeile.

Hinweise

Wenn die Sortierung nicht definiert ist, wird standardmäßig ein ungebundener Fensterrahmen (rowFrame, unboundedPreceding, unboundedFollowing) verwendet. Wenn die Sortierung definiert ist, wird standardmäßig ein wachsender Fensterrahmen (rangeFrame, unboundedPreceding, currentRow) verwendet.

Beispiele

Einfaches Fenster mit Sortierung und Zeilenrahmen

from pyspark.sql import Window

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

Partitioniertes Fenster mit Bereichsrahmen

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)

Zeilennummer innerhalb der 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()

Ausführen der Summe mit zeilenbasiertem Frame

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

Ausführen der Summe mit bereichsbasiertem Frame

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