如何在 Polars 中高效处理超出内存的 Snowflake 大数据集

轻晨酱_8711

轻晨酱_8711

2026-09-22

181人浏览

原创

如何在 Polars 中高效处理超出内存的 Snowflake 大数据集

本文介绍在 polars 当前版本(1.25.2+)下处理超内存 snowflake 数据集的实用方案:通过 snowflake python connector 分批拉取 arrow 批次,结合 polars 流式处理,并规避零行返回、类型不一致等常见陷阱。

本文介绍在 polars 当前版本(1.25.2+)下处理超内存 snowflake 数据集的实用方案:通过 snowflake python connector 分批拉取 arrow 批次,结合 polars 流式处理,并规避零行返回、类型不一致等常见陷阱。

Polars 本身暂未原生支持对 Snowflake 的“懒查询下推”或内置分页/流式执行(如 pl.scan_database_uri 尚未实现),pl.read_database_uri(..., engine="adbc") 仍为一次性全量加载,无法直接应对 GB/TB 级 Snowflake 表。因此,需借助 Snowflake 官方 Python Connector 实现可控的分批拉取,并在 Python 层完成 Polars 驱动的数据处理流水线。

✅ 推荐方案:Arrow 批次流式拉取 + Polars 增量处理

使用 snowflake-connector-python >= 3.10.0 提供的 fetch_arrow_batches() 方法,可将查询结果以 Apache Arrow RecordBatch 流形式逐批获取,每批次可独立转为 Polars LazyFrame 或 DataFrame,实现内存友好型处理:

import snowflake.connector
import polars as pl

conn = snowflake.connector.connect(
    user="your_user",
    password="your_pass",
    account="your_account",
    warehouse="YOUR_WH",
    database="YOUR_DB",
    schema="YOUR_SCHEMA"
)

cursor = conn.cursor()
query = "SELECT * FROM large_table WHERE event_date >= '2024-01-01'"

# 关键:启用 Arrow 批次流式获取
cursor.execute(query)
batches = cursor.fetch_arrow_batches()

# 按批次处理(示例:累加统计 + 类型对齐)
total_rows = 0
schema = None
for i, batch in enumerate(batches):
    # 强制统一 schema:首次获取时缓存,后续批次 cast 对齐(防类型漂移)
    if schema is None:
        schema = batch.schema
    else:
        batch = batch.cast(schema)  # Arrow cast 防止 int64 vs int32 等不一致

    lf = pl.from_arrow(batch).lazy()  # 转为 LazyFrame,支持链式计算
    stats = lf.select([
        pl.count().alias("batch_count"),
        pl.col("amount").sum().alias("batch_sum")
    ]).collect()

    total_rows += stats["batch_count"][0]
    print(f"Batch {i+1}: {stats['batch_count'][0]} rows, sum={stats['batch_sum'][0]}")

print(f"Total processed: {total_rows} rows")

⚠️ 注意事项与避坑指南

  • 零行查询返回 Nonefetch_arrow_all() 在无结果时默认返回 None,而非空 Table。务必使用 force_return_table=True 参数确保返回一致的 Arrow Table:

    table = cursor.fetch_arrow_all(force_return_table=True)  # 安全兜底
  • 批次间列类型不一致:Snowflake 可能因分区/谓词下推导致不同批次中同一列推断出不同 Arrow 类型(如 int64 vs int32)。建议在循环中显式 batch.cast(expected_schema),或首次获取后用 pl.from_arrow(batch).schema 提取 Polars Schema 并统一 cast。

    人工智能数字技术机器人全息大脑大数据分析矢量素材(EPS)
    人工智能数字技术机器人全息大脑大数据分析矢量素材(EPS)

    这是一款人工智能数字技术机器人全息大脑大数据分析矢量素材,格式为 EPS,含 JPG 预览图。

    下载
  • 内存与性能权衡fetch_arrow_batches() 默认批次大小约 1MB;可通过 arrow_number_of_batches 连接参数或 SQL hint(如 /*+ USE_CACHED_RESULT */)优化,但更推荐在 SQL 层完成过滤、聚合下推——例如将 GROUP BYWHERELIMIT 尽可能留在 Snowflake 执行,只将必要字段拉入 Polars。

? 替代思路与演进展望

  • 若业务逻辑高度聚合(如日报指标),优先采用 pl.read_database_uri(..., query=...) + 精心编写的下推 SQL,避免传输冗余数据;
  • 关注 Polars 未来版本:社区已提出 RFC #12729 探索 scan_database 接口支持 ADBC 流式扫描,长期可期待原生集成;
  • 对极大规模场景,可结合 DuckDB(支持 read_parquet("s3://...") + ATTACH 'snowflake://...')做混合查询,或使用 Snowflake’s COPY INTO 导出至外部存储(S3/GCS)再用 pl.scan_parquet() 流式扫描。

总之,在当前生态下,“SQL 下推 + Arrow 分批 + Polars 增量处理”是最稳健、可控且生产就绪的路径——它不依赖尚未成熟的实验性接口,同时充分发挥了 Snowflake 的计算能力与 Polars 的本地处理效率。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

大数据

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1551

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3644

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1569

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20837

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2587

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2627

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1063

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2043

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 169人学习

大数据(MySQL)视频教程完整版
大数据(MySQL)视频教程完整版

共200课时 | 26.8万人学习

PHP会话控制/文件上传/分页技术
PHP会话控制/文件上传/分页技术

共22课时 | 2.8万人学习