다음을 통해 공유


Window 클래스

DataFrames에서 창을 정의하기 위한 유틸리티 함수입니다.

Spark Connect 지원

클래스 특성

특성 설명
unboundedPreceding 바인딩되지 않은 창 프레임의 시작을 나타내는 경계 값입니다.
unboundedFollowing 바인딩되지 않은 창 프레임의 끝을 나타내는 경계 값입니다.
currentRow 창 프레임의 현재 행을 나타내는 경계 값입니다.

메서드

메서드 설명
orderBy(*cols) 순서가 정의된 WindowSpec을 만듭니다.
partitionBy(*cols) 분할이 정의된 WindowSpec을 만듭니다.
rangeBetween(start, end) 현재 행 ORDER BY 값의 범위 기반 오프셋을 사용하여 프레임 경계가 정의된 WindowSpec을 만듭니다(포함)에서 start (포함)end
rowsBetween(start, end) 현재 행의 행 기반 오프셋을 사용하여(포함)에서 start (포함)까지 end 정의된 프레임 경계를 사용하여 WindowSpec을 만듭니다.

Notes

순서 지정이 정의되지 않은 경우 바인딩되지 않은 창 프레임(rowFrame, unboundedPreceding, unboundedFollowing)이 기본적으로 사용됩니다. 순서 지정이 정의되면 증가하는 창 프레임(rangeFrame, unboundedPreceding, currentRow)이 기본적으로 사용됩니다.

예제

순서 및 행 프레임이 있는 기본 창

from pyspark.sql import Window

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

범위 프레임이 있는 분할된 창

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)

파티션 내의 행 번호

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

행 기반 프레임을 사용하여 합계 실행

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

범위 기반 프레임을 사용하여 합계 실행

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