TL;DR

  • Polars 2.0.0은 Python Polars 2.0과 기본 활성화된 OOC(Out-of-Core), 다양한 SQL·데이터 처리 기능 및 성능 개선을 포함한 주요 릴리스임.
  • OOC 메모리 임계값은 사용 가능한 RAM의 80%, 기본 디스크 예산은 64GB로 설정되며 POLARS_OOMKILL_THRESHOLD_MB 환경 변수가 추가됨.
  • SQL 윈도 함수와 QUALIFY 처리 순서, SQL 숫자 리터럴의 Decimal 처리, Parquet ENUM의 pl.String 읽기 등 호환성이 바뀌는 변경 사항이 포함됨.
  • 스트리밍 정렬·그룹화, 조인·필터 푸시다운, Parquet·IPC 스캔 및 Decimal 연산 등에서 성능 개선이 이뤄짐.
  • 맵(Map)과 근사 분위수, SQL 그룹 집계 확장, Iceberg·원격 엔진 연동 등 기능이 확장되고 다양한 버그 수정과 문서 개선이 포함됨.

주요 변경 사항

  • SQL 윈도 함수가 그룹화된 행이 아니라 집계된 행에서 실행되며, QUALIFY가 프로젝션 전에 평가됨.
  • SQL 숫자 리터럴의 타입이 Decimal로 지정되고 SQL %·DIV 연산이 절삭 처리됨.
  • 결정론적 표현식 플러그인이 공통 부분식 제거(CSE)와 공통 하위 표현식 푸시다운(CSPE)을 선택적으로 사용 가능함.
  • Parquet ENUM 타입을 pl.String으로 읽음.
  • 맵(Map) 연산이 확장되고 cut·qcut이 사용 중단 예정임.

성능 개선

  • 스트리밍 및 메모리 사용을 개선하기 위해 OOC 경로, 그룹화, 조인, 정렬, 윈도 함수, 프리페치 및 런타임 필터를 폭넓게 최적화함.
  • 원격 IPC·Parquet 스캔에서 순서가 관찰되지 않을 때 파일과 데이터를 비순서 방식으로 처리하며, IPC 메타데이터 접미부 읽기와 레코드 배치 가져오기를 개선함.
  • Lance와 Iceberg 스캔에 필터 푸시다운을 적용하고, Iceberg 매니페스트 파일을 스캔 간 캐시하며, Hive 조건자와 Parquet 통계를 활용한 최적화를 개선함.
  • 스트리밍 OOC 정렬, 고정 크기 롤링 윈도, 병렬 행 인코딩 및 그룹화 처리 등 데이터 처리 경로를 개선함.
  • Decimal 덧셈·뺄셈·곱셈에서 값이 맞는 경우 64비트 정수를 사용하고, 합계·평균 연산과 스케일 조정 비용을 줄임.
  • SQL 계획, 표현식 바이트코드 파서, 정규식, is_in, LIKE, as_list, 행 인코딩, 캐시 제거 및 조인 순서 추정 등 다수의 경로를 최적화함.
  • 클라우드 소형 업로드에 단일 PUT을 사용하고 HTTP 읽기 속도 제한 기본값과 원격 스캔 처리도 조정함.

기능 개선

  • Python용 Polars 2.0을 릴리스하고 OOC를 기본 활성화함. 사용 가능한 RAM의 80%를 임계값으로 사용하며 기본 OOC 디스크 예산은 64GB임.
  • POLARS_OOMKILL_THRESHOLD_MB 환경 변수, 다중 표현식을 지원하는 pipe_with_dtype, 새 표현식 및 함수 pipe_with_dtype를 추가함.
  • SQL FIRST_VALUE·LAST_VALUE의 윈도 프레임을 지원하고 NTH_VALUE, LAG·LEAD 기본값을 추가함.
  • SQL에서 GROUPING SETS, ROLLUP, CUBE, GROUPING()을 지원하며 APPROX_QUANTILE을 SQL 프런트엔드와 스트리밍 엔진에서 사용할 수 있음.
  • 근사 분위수 스케치 상태를 프로세스 간 병합 가능하게 하고 메모리 내 근사 분위수 기능을 추가함.
  • JSON·NDJSON 읽기 및 쓰기에서 맵 타입을 지원하고 struct.eval과 scan_external_reader를 추가함.
  • 불안정 기능인 scan_lance를 추가하고 collect 및 collect_batches에서 RemoteEngine을 지원함.
  • 조인 키의 셀렉터, Iceberg 네이티브 싱크의 정렬 순서, Iceberg 싱크의 재실행 간 멱등 커밋을 지원함.
  • erf(c) 함수와 여러 맵 연산을 추가하고 is_in 및 맵 조회의 타입 변환을 데이터 타입만으로 결정하도록 개선함.
  • Cloud object store 입출력 오류의 유형과 메시지를 개선하고, 물리 노드와 중간 표현(IR) 노드의 연결 정보를 제공함.
  • DataFrame 메모리 사용량 추정, BytecodeParser의 사용자 정의 함수 변수 해석, Python 3.15 호환성 및 scan_iceberg·Delta 관련 방문자 속성을 개선함.

버그 수정

  • SQL 집계 함수 이름 탐색, 중첩 집계 오류, 윈도 함수의 동률·NULL 순위 및 프레임 처리, 이름 있는 윈도, QUALIFY와 파생 테이블 처리 문제를 수정함.
  • 동적 그룹화와 윈도 경계, 그룹화 조건자 푸시다운, 정렬 버킷 메모리 예약, 입력 순서 유지, 다중 입력 그룹화의 높이 계산 문제를 수정함.
  • Decimal 결과 스케일·정밀도, 혼합 스케일 연산, 정수 연산, Decimal과 정수의 스키마 및 Parquet 통계 처리를 수정함.
  • is_in의 NULL·혼합 데이터 타입·범주형 처리, 목록의 contains, 정렬된 중첩 타입, 문자열 소문자·제목 대문자 및 유니코드 zfill 동작을 수정함.
  • Parquet·IPC·CSV·Avro·Excel·데이터베이스 읽기와 Iceberg·Delta·S3 처리에서 발생하는 여러 오류와 성능 회귀를 수정함.
  • 빈 윈도 및 분위수 입력에서의 패닉, 들쭉날쭉한 행 처리, TPCH SQL의 메모리 부족, 퍼징 오류와 스트리밍 슬라이스 길이 문제를 수정함.
  • SQL 윈도 함수의 PERCENT_RANK, CUME_DIST, NTILE을 추가하고 NULL 및 동률 처리와 추가 윈도 프레임 지원을 보완함.

문서

  • API 참조에 엔진과 누락된 항목을 추가하고, RC2 변경 사항을 마이그레이션 가이드에 반영함.
  • 일광 절약 시간제(DST) 전환과 관련한 모호한 매개변수 설명, read_csv·scan_csv의 gzip·zstd 압축 문서를 보완함.
  • LazyFrameResolver, 새 enable_monitoring 기능 및 join_where 엔진 태그 문서를 개선함.

기타 개선

  • 범주형 is_in 조회에서 범주 매핑을 유지하고, 각 크레이트의 임시 열 이름 카운터를 분리함.
  • 롤링·동적 그룹화의 윈도 배치, 시간 그룹화 인덱스 공간 공유 및 동적 윈도 시작점 계산을 정리함.
  • 빌드 의존성 object_store를 0.14.2로, rustls를 0.23.45로 갱신하고 maturin 및 ARM64 Windows 릴리스 파이프라인 빌드 의존성을 업데이트함.
  • 릴리스 날짜는 10월 6일이며, 다수의 기여자가 릴리스에 참여함.