Pular para o conteúdo principal

Classe Janela

Funções úteis para definir janelas em DataFrames.

Compatível com Spark Connect

Atributos de classe

Atributo

Descrição

unboundedPreceding

Valor limite que representa o início de uma moldura de janela ilimitada.

unboundedFollowing

Valor limite que representa o final de uma moldura de janela ilimitada.

currentRow

Valor limite que representa a linha atual em um quadro de janela.

Métodos

Método

Descrição

orderBy(*cols)

Cria um objeto WindowSpec com a ordenação definida.

partitionBy(*cols)

Cria um objeto WindowSpec com o particionamento definido.

rangeBetween(start, end)

Cria um WindowSpec com os limites do quadro definidos, de start (inclusive) a end (inclusive), usando deslocamentos baseados em intervalo a partir do valor ORDER BY da linha atual.

rowsBetween(start, end)

Cria um WindowSpec com os limites do quadro definidos, de start (inclusive) a end (inclusive), usando deslocamentos baseados em linhas a partir da linha atual.

Notas

Quando a ordenação não é definida, um quadro de janela ilimitado (rowFrame, unboundedPreceding, unboundedFollowing) é usado por default. Quando a ordenação é definida, uma moldura de janela crescente (rangeFrame, unboundedPreceding, currentRow) é usada por default.

Exemplos

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

Python
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 dividida com moldura de alcance

Python
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

Python
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 acumulada com quadro baseado em linhas

Python
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 acumulada com quadro baseado em intervalo

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