Partilhar via


Classe de janela

Funções utilitárias para definir janela em DataFrames.

Suporta Spark Connect

Atributos de classe

Attribute Descrição
unboundedPreceding Valor de fronteira representando o início de uma moldura de janela ilimitada.
unboundedFollowing Valor de fronteira que representa o fim de uma moldura de janela ilimitada.
currentRow Valor de fronteira representando a linha atual numa moldura de janela.

Methods

Método Descrição
orderBy(*cols) Cria um WindowSpec com a ordem definida.
partitionBy(*cols) Cria um WindowSpec com a partição definida.
rangeBetween(start, end) Cria um WindowSpec com os limites do frame definidos, de start (inclusivo) para end (inclusivo), usando deslocamentos baseados em intervalos em relação ao valor da ORDER BY linha atual.
rowsBetween(start, end) Cria um WindowSpec com os limites do frame definidos, de start (inclusivo) para end (inclusivo), usando deslocamentos baseados em linhas da linha atual.

Notes

Quando a ordenação não está definida, um frame de janela ilimitado (rowFrame, unboundedPreceding, unboundedFollowing) é usado por defeito. Quando a ordem é definida, uma frame de janela crescente (rangeFrame, unboundedPreceding, currentRow) é usada por defeito.

Exemplos

Janela básica com ordenação e frame de linha

from pyspark.sql import Window

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

Janela particionada com moldura de alcance

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)

Número da linha dentro da partição

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

Soma corrente com quadro baseado em linhas

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

Soma corrente com quadro baseado em alcance

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