Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

코드로 미리보기 입력 필터 정의

Code-defined filters는 Python 함수로 preview 입력을 정하는 전략입니다. 특정 사례를 고르거나 여러 preview에서 같은 필터를 재사용하고, 여러 필터를 순서대로 연결할 수 있습니다.

입력 필터는 전체 운영 데이터셋을 대상으로 평가하므로 출력이 작다는 사실만으로 빠르게 실행되는 것은 아닙니다. 지원되는 조건은 predicate pushdown을 활용할 수 있으며 필터 구현 자체도 효율적으로 작성해야 합니다.

필터 선택과 순서

Preview > Configure input strategy > Code-defined filters를 선택합니다. 기본 제공 필터 또는 코드에서 발견한 필터를 선택하고 순서를 정합니다. 필터들은 지정한 순서대로 적용됩니다.

함수 검색 조건

필터 함수는 모듈 전역에 직접 정의하고 입력 및 반환 타입을 모두 지정해야 합니다.

입력 종류필터 서명
Spark의 표 형식 입력(pyspark.sql.DataFrame) -> pyspark.sql.DataFrame
lightweight의 표 형식 입력(polars.LazyFrame) -> polars.LazyFrame
Spark/lightweight의 원본 파일 입력(Iterator[transforms.api.FileStatus]) -> Iterator[transforms.api.FileStatus]

다음 함수는 검색 대상이 아닙니다.

  • 다른 함수 안에 중첩한 함수
  • if, with, for 등 문장 안에서 정의한 함수
  • 클래스 메서드
  • 다른 곳에서 가져온 필터 함수 자체
  • 함수에 대입한 변수 별칭
  • async 함수 또는 이름이 _로 시작하는 함수
  • decorator를 붙인 함수

타입과 사용하는 라이브러리를 import하는 것은 가능하지만 검색할 필터 함수는 해당 모듈에 직접 정의합니다.

세 가지 필터 예제

가상의 동물 입력에는 Habitat 문자열 열이 있다고 가정합니다.

from collections.abc import Iterator
import itertools
from transforms.api import FileStatus
from pyspark.sql import DataFrame
from pyspark.sql import functions as F
import polars as pl


def limit_files(files: Iterator[FileStatus]) -> Iterator[FileStatus]:
    return itertools.islice(files, 10)


def ocean_animals_only(df: DataFrame) -> DataFrame:
    return df.filter(F.col("Habitat") == "Ocean")


def grassland_animals_only_lightweight(df: pl.LazyFrame) -> pl.LazyFrame:
    return df.filter(pl.col("Habitat") == "Grassland")

첫 함수는 파일 목록 앞의 최대 10개를 반환하며 무작위 표본 함수가 아닙니다. 두 번째와 세 번째는 해당 엔진의 표 형식 입력을 좁힙니다. 선택한 transform의 입력 종류에 맞는 서명을 사용합니다.

사용 가능한 함수에는 CodeLens 힌트가 표시됩니다.

매개변수

첫 입력 뒤에 *를 넣고 keyword-only 매개변수를 정의합니다. 매개변수에도 타입 힌트가 있어야 하며 지원 타입은 str, int, float와 bool입니다.

from pyspark.sql import DataFrame
from pyspark.sql import functions as F


def filter_animals_by_habitat(df: DataFrame, *, habitat: str) -> DataFrame:
    return df.filter(F.col("Habitat") == habitat)

필터를 선택하면 확장이 값을 요청합니다.

기본값이 있으면 설정에서 값을 넣지 않았을 때 그 값을 사용합니다. 아래 가상 입력은 value 수치 열, message 문자열 열과 active Boolean 열을 가지며 모든 매개변수가 실제 필터 또는 행 수 제한에 사용됩니다.

from pyspark.sql import DataFrame
from pyspark.sql import functions as F


def example_filter_with_params(
    df: DataFrame,
    *,
    int_param: int,
    float_param: float = 3.3,
    str_param: str = "Hello world",
    bool_param: bool = True,
) -> DataFrame:
    return df.filter(
        (F.col("value") > float_param)
        & (F.col("message") == str_param)
        & (F.col("active") == bool_param)
    ).limit(int_param)

int_param은 필수 행 상한입니다. 나머지 세 매개변수는 기본값이 있어 선택 입력입니다. 필터 순서에 따라 limit을 먼저 적용한 결과와 조건 필터 뒤에 적용한 결과가 달라질 수 있습니다.

반복 개발에서는 Active Preview가 필터 결과를 메모리에 캐시하므로 입력이 메모리에 들어오는 범위를 사용합니다.