Polars表达式插件框架是否保证数据块对齐?
Polars表达式插件框架是否保证数据块对齐?
没错,Polars的表达式插件框架确实会保证传入插件的所有输入Series的数据块是完全对齐的,这是框架刻意设计的行为,就是为了避免你遇到这类容易踩坑的情况。
为什么你的测试会出现这个结果?
你在Python代码里创建了两个chunk结构完全不对齐的列:
input_1是两个chunk,长度分别是3和2input_2是两个chunk,长度分别是2和3
但当这些数据传入你的Rust表达式插件时,Polars会在执行插件逻辑之前,自动对所有输入列做**数据块对齐(chunk alignment)**处理——它会重新划分(或合并)数据块,让所有输入列的chunk结构完全一致。在你的例子里,就是把两个列的chunk都合并成了单一chunk,所以插件里打印出来的都是1个chunk、总长度5的结果。
这种保证是始终有效的吗?
是的,不管你传入的原始列chunk结构多么混乱,Polars表达式执行引擎在调用自定义插件之前,都会完成这一步对齐操作。这是Polars表达式体系的核心特性之一:不管是内置表达式还是你写的Rust自定义插件,都能基于对齐的数据块进行安全的向量化操作,不用开发者自己去处理复杂的chunk匹配逻辑,大幅降低出错概率。
你完全可以在插件代码里放心假设:所有输入Series的chunk数量相同,且每个对应位置的chunk长度完全一致。
附上你的测试代码和输出
Rust插件代码
#[polars_expr(output_type=Float64)] fn print_chunk_length(inputs: &[Series]) -> PolarsResult<Series> { let input_1: &Float64Chunked = inputs[0].f64()?; let input_2: &Float64Chunked = inputs[1].f64()?; println!("Chunks in input_1: {number}", number = input_1.chunks().len()); println!("Chunks in input_2: {number}", number = input_2.chunks().len()); println!("input_1 len: {number}", number = input_1.len()); println!("input_2 len: {number}", number = input_2.len()); let result = input_1 + input_2; Ok(result.into_series()) }
Python测试代码
from noxide.propulsion.hull_vs_weather import print_chunk_length import polars as pl df = pl.DataFrame( { "input_1": pl.Series([5.2, 6.1,0.4]).append(pl.Series([0.3,0.4])), "input_2": pl.Series([5.2, 6.1]).append(pl.Series([0.3,0.4,0.4])), } ) print(f"Column input_1 chunk 1 length outside rust : {len(df.get_column('input_1').get_chunks()[0])}") print(f"Column input_1 chunk 2 length outside rust : {len(df.get_column('input_1').get_chunks()[1])}") print(f"Column input_2 chunk 1 length outside rust : {len(df.get_column('input_2').get_chunks()[0])}") print(f"Column input_2 chunk 2 length outside rust : {len(df.get_column('input_2').get_chunks()[1])}") df.with_columns(result=print_chunk_length(pl.col("input_1"), pl.col("input_2")))
输出结果
Column input_1 chunk 1 length outside rust : 3 Column input_1 chunk 2 length outside rust : 2 Column input_2 chunk 1 length outside rust : 2 Column input_2 chunk 2 length outside rust : 3 Chunks in input_1: 1 Chunks in input_2: 1 input_1 len: 5 input_2 len: 5
内容来源于stack exchange
相关产品推荐
相关产品推荐

