Polars使用Lazy API结合分类特征做Join未按预期运行是什么原因
问题原因
- 你对官方文档的描述存在理解偏差:官方提到的Lazy API无需额外配置字符串缓存,前提是分类类型的转换逻辑包含在同一个全局查询计划中,由Polars在查询优化阶段统一处理缓存共享。
- 你当前的写法是先分别得到两个独立的LazyFrame,再各自对
admin列执行分类类型转换,两个转换逻辑分属独立的上下文,Polars无法自动识别两个分类列需要共享字符串缓存,因此抛出错误,这不属于Polars的bug。
正确实现方案
推荐将分类转换逻辑提前到上游的公共DataFrame中,保证两个分支的分类列来自同源的转换逻辑,无需手动开启全局字符串缓存即可正常运行,示例代码如下:
# 提前对公共输入的admin列做分类转换,再生成LazyFrame admin_df = admin_df.with_columns( pl.col("admin").cast(pl.Categorical) ).lazy() # 后续分组聚合逻辑直接复用已经转好分类的列 count = admin_df.groupby(['admin','EVENT_DATE']).pivot(pivot_column='FIVE_TYPE',values_column='count').first() fatalities = admin_df.groupby(['admin','EVENT_DATE']).pivot(pivot_column='FIVE_TYPE',values_column='FATALITIES').first() admin_df = fatalities.join(count,on=['admin','EVENT_DATE']).collect()
你目前使用with pl.StringCache():包裹全量代码的方案也是可行的,适合不方便调整转换逻辑位置的场景。
内容的提问来源于stack exchange,提问作者seb2704
相关产品推荐
相关产品推荐

