You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars:能否替换计算图源头的LazyFrame?实现序列化执行计划复用

序列化Polars LazyFrame执行计划并应用到新数据的可行方案

Polars当前的serialize()/deserialize()方法是序列化完整的LazyFrame对象(包含数据源),所以你直接调用actual_data.deserialize()会反序列化出原本绑定空数据源的LazyFrame,自然会报列不存在的错误。不过你要的「序列化执行计划、反序列化后应用到新数据」的需求完全可以实现,核心思路是单独提取并序列化LazyFrame的LogicalPlan(逻辑执行计划),再将其绑定到新的数据源上。

具体实现步骤

1. 定义并序列化执行计划

在管道定义环境中,从空LazyFrame提取LogicalPlan并序列化:

import polars as pl
import pickle

# 基于空LazyFrame定义执行步骤
empty_lf = pl.LazyFrame()
step1_lf = empty_lf.with_columns(pl.col('a') + 1)
step2_lf = step1_lf.filter(pl.col('a') > 2)

# 序列化LogicalPlan(可用pickle或Polars自带的序列化工具)
# 方式1:使用pickle
serialized_plan = pickle.dumps(step2_lf.plan)

# 方式2:使用Polars原生序列化(更安全,避免pickle的兼容性问题)
# serialized_plan = pl.serialize(step2_lf.plan)

2. 反序列化并应用到实际数据

在执行环境中,加载实际数据后,将反序列化的LogicalPlan绑定到新的LazyFrame:

import polars as pl
import pickle

# 加载实际业务数据
actual_data = pl.LazyFrame({'a': [1, 2, 3]})

# 反序列化LogicalPlan
# 对应方式1:pickle
deserialized_plan = pickle.loads(serialized_plan)

# 对应方式2:Polars原生反序列化
# deserialized_plan = pl.deserialize(serialized_plan)

# 将执行计划绑定到新数据源并执行
processed_data = actual_data.with_plan(deserialized_plan).collect()
print(processed_data)

执行结果会输出:

shape: (1, 1)
┌─────┐
│ a   │
│ --- │
│ i64 │
├─────┤
│ 3   │
└─────┘

关键注意事项

  • 版本一致性:LogicalPlan的内部结构可能随Polars版本迭代变化,必须保证序列化和反序列化环境的Polars版本完全一致,否则会出现兼容性错误。
  • 自定义函数(UDF)处理:如果执行计划中用到了自定义UDF,需要确保执行环境中存在相同的函数定义,且能被正确加载,否则反序列化或执行时会失败。
  • 序列化方式选择:如果对安全性要求较高,优先使用Polars原生的pl.serialize()/pl.deserialize(),避免pickle的潜在安全风险;如果需要跨语言或复杂对象支持,再考虑pickle。

内容的提问来源于stack exchange,提问作者wterry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 14:29:51