如何取消Polars LazyFrame查询计划中的select操作?
如何取消Polars LazyFrame的select操作而无需重新执行合并?
我的处理流程(实际查询计划更复杂)
- 合并一周数据(延迟执行)
week_data = pl.scan_parquet(one_week_data[0]) for day in one_week_data[1:]: temp = pl.scan_parquet(day) week_data = pl.concat([week_data, temp])
- 调整列顺序并选择部分列
week_data = week_data.select([ 'OID_', 'Hashed_Device_ID', 'Lat_of_Observation_Point', 'Lon_of_Observation_Point', 'Polygon_ID', 'Unix_Timestamp_of_Observation_Point', 'Local_Timezone_of_Observation_Point' ])
现在希望无需重新执行合并步骤,直接取消上述select操作,是否有可行方法?
可行解决方案
因为你使用的是Polars的延迟执行(Lazy API),所有操作都是构建查询计划而非实际计算数据,所以完全可以不用重新执行合并,直接调整查询计划来取消select操作:
方法1:回溯查询计划(精准移除select步骤)
如果week_data的最后一步操作就是select,可以直接获取该操作的输入节点,恢复到select之前的状态:
# 获取select操作前的LazyFrame,跳过最后一步select week_data = week_data.plan.input
方法2:选择所有列(通用兼容方式)
如果不确定查询计划的具体结构,或者select之后还叠加了其他操作,直接选择所有列即可覆盖之前的select逻辑,同时保留原数据的所有列和顺序:
# 选择全部列,等同于取消之前的自定义select week_data = week_data.select(pl.all())
这两种方法都不会触发实际的数据合并计算,只有当你调用collect()时,Polars才会根据修改后的查询计划执行最终计算。
内容的提问来源于stack exchange,提问作者Amri Rasyidi
相关产品推荐
相关产品推荐

