<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p" -->

---
title: Announcing Polars 2.1 | daily.dev
description: Polars 2.1 adds out-of-core group-by's, recursive SQL, attached Iceberg catalogs, encrypted Parquet and nearly 90 performance improvements. High-cardinality...
canonical: https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Announcing Polars 2.1 | daily.dev
og:description: Polars 2.1 adds out-of-core group-by's, recursive SQL, attached Iceberg catalogs, encrypted Parquet and nearly 90 performance improvements. High-cardinality...
og:url: https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p
og:image: https://api.daily.dev/og/posts/wq74KBq6p.png
og:image:alt: Announcing Polars 2.1
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Announcing Polars 2.1

**[Polars Blog](https://daily.dev/sources/polars)** · 6 min read · 1 upvotes · 0 comments

## Summary

Polars 2.1 adds out-of-core group-by's, recursive SQL, attached Iceberg catalogs, encrypted Parquet and nearly 90 performance improvements. High-cardinality group-by's can now spill to disk instead of running out of memory. SQL support grows with 'WITH RECURSIVE' CTEs, correlated subqueries, and functions like 'generate_series' and 'REGEXP_REPLACE'. Iceberg tables can now be created, written, queried and dropped directly from Polars, and both reading and writing encrypted Parquet files is supported. The release drops Python 3.10 support and disallows mixed string-numeric arithmetic in eager mode, which now raises as it already did in lazy mode.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://pola.rs/posts/polars-2-1-changelog>

## Questions this post answers

### How do I enable out-of-core group-by in Polars to avoid running out of memory?

Polars now runs the streaming group-by out of core automatically, spilling state to disk when it does not fit in the memory budget set by 'POLARS_OOC_MEMORY_BUDGET_MB'. You can also set 'POLARS_OOC_LOG_METRICS=1' to see spill stats, and use 'POLARS_OOMKILL_THRESHOLD_FRACTION' to configure an out-of-memory kill threshold.

_Teams scaling group-by's past memory limits can track Polars engine changes like this on daily.dev._

### Does Polars 2.1 support reading and writing encrypted Parquet files?

Yes, Polars 2.1 adds support for both reading and writing encrypted Parquet files. This feature is still marked unstable, meaning its API may change in a later release, alongside other new unstable features like 'register_catalog', 'delete_iceberg', and masked numpy array conversion.

_Developers handling sensitive Parquet data can follow encryption support maturity on daily.dev._

### What breaking changes should I check before upgrading to Polars 2.1?

Two changes need attention: mixed string-numeric arithmetic in eager mode, like 'pl.Series([1, 2]) + "4"', now raises an error instead of returning string-coerced results, matching existing lazy-mode behavior. Also, support for Python 3.10 has been dropped, so upgrading requires Python 3.11 or newer.

_Upgrading a Polars pipeline safely means checking breaking changes like these on daily.dev first._

## Similar posts on daily.dev

- [Release of Polars 2.0](https://daily.dev/posts/release-of-polars-2-0-84cwf427y) · Polars Blog · 4 upvotes · 0 comments
- [Announcing Polars 1.44](https://daily.dev/posts/announcing-polars-1-44-nyx9iebfn) · Polars Blog · 1 upvotes · 0 comments
- [Announcing Apache Iceberg 1.11.0](https://daily.dev/posts/announcing-apache-iceberg-1-11-0-laq8a21od) · Google Open Source Blog · 4 upvotes · 0 comments
- [Apache Polaris with PyIceberg: A Guide](https://daily.dev/posts/apache-polaris-with-pyiceberg-a-guide-ykkijp45z) · Dremio Blog · 0 upvotes · 0 comments

---

Tags: [#python](https://daily.dev/tags/python), [#sql](https://daily.dev/tags/sql), [#big-data](https://daily.dev/tags/big-data), [#apache-iceberg](https://daily.dev/tags/apache-iceberg), [#polars](https://daily.dev/tags/polars)

[View this post on daily.dev](https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Announcing Polars 2.1","url":"https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p"},"datePublished":"2026-10-27T14:20:32.211Z","dateModified":"2026-10-27T14:25:08.125Z","description":"Polars 2.1 adds out-of-core group-by's, recursive SQL, attached Iceberg catalogs, encrypted Parquet and nearly 90 performance improvements. High-cardinality...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/37d3fe3674855b025b183f30fb4badd0?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/37d3fe3674855b025b183f30fb4badd0?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Polars Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Polars Blog","logo":"https://media.daily.dev/image/upload/s--xo60W3UW--/c_limit,w_256/f_auto,q_auto/v1786870390/logos/polars?_a=BAMAMicg0","url":"https://daily.dev/sources/polars"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"python,sql,big-data,apache-iceberg,polars","timeRequired":"PT6M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Polars Blog","item":"https://daily.dev/sources/polars"},{"@type":"ListItem","position":3,"name":"Announcing Polars 2.1"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/announcing-polars-2-1-wq74kbq6p#faq","mainEntity":[{"@type":"Question","name":"How do I enable out-of-core group-by in Polars to avoid running out of memory?","acceptedAnswer":{"@type":"Answer","text":"Polars now runs the streaming group-by out of core automatically, spilling state to disk when it does not fit in the memory budget set by 'POLARS_OOC_MEMORY_BUDGET_MB'. You can also set 'POLARS_OOC_LOG_METRICS=1' to see spill stats, and use 'POLARS_OOMKILL_THRESHOLD_FRACTION' to configure an out-of-memory kill threshold. Teams scaling group-by's past memory limits can track Polars engine changes like this on daily.dev."}},{"@type":"Question","name":"Does Polars 2.1 support reading and writing encrypted Parquet files?","acceptedAnswer":{"@type":"Answer","text":"Yes, Polars 2.1 adds support for both reading and writing encrypted Parquet files. This feature is still marked unstable, meaning its API may change in a later release, alongside other new unstable features like 'register_catalog', 'delete_iceberg', and masked numpy array conversion. Developers handling sensitive Parquet data can follow encryption support maturity on daily.dev."}},{"@type":"Question","name":"What breaking changes should I check before upgrading to Polars 2.1?","acceptedAnswer":{"@type":"Answer","text":"Two changes need attention: mixed string-numeric arithmetic in eager mode, like 'pl.Series([1, 2]) + \"4\"', now raises an error instead of returning string-coerced results, matching existing lazy-mode behavior. Also, support for Python 3.10 has been dropped, so upgrading requires Python 3.11 or newer. Upgrading a Polars pipeline safely means checking breaking changes like these on daily.dev first."}}]}
```

