摘要表
1. 惰性与立即执行
pandas (立即)
DataStore (惰性)
为什么这很重要
- 查询优化:多个操作会编译成一条 SQL 查询
- 列裁剪:仅读取所需的列
- 过滤器下推:过滤器会在源端生效
- 内存效率:避免加载不需要的数据
2. 返回类型
pandas
DataStore
转换为 pandas 数据类型
3. 执行触发器
保持惰性执行的操作
4. 行的顺序
pandas
DataStore
rowNumberInAllBlocks()) ,以确保顺序与 pandas 保持一致。
何时会保留行顺序
- 文件源 (CSV、Parquet、JSON 等)
- pandas DataFrame 源
- 过滤操作
- 列选择
- 显式调用
sort()或sort_values()之后 - 会确定顺序的操作 (
nlargest()、nsmallest()、head()、tail())
顺序何时可能发生变化
- 在
groupby()聚合之后 (使用sort_values()可确保顺序一致) - 使用某些 join type 进行
merge()/join()之后 - 在 性能模式 (
config.use_performance_mode()) 下:任何操作的行顺序都无法保证。请参见性能模式。
5. 没有 inplace 参数
pandas
DataStore
inplace=True。请始终将结果赋值给变量:
为什么没有 inplace?
- 查询构建 (惰性求值)
- 线程安全
- 更容易调试
- 更简洁的代码
6. 索引支持
pandas
DataStore
DataStore 的数据来源很重要
- DataFrame 来源:保留 pandas 索引
- File 来源:使用简单的整数索引
7. 比较行为
与 pandas 对比
使用 equals()
8. 类型推断
pandas
DataStore
显式类型转换
9. 内存模型
pandas
DataStore
10. 错误信息
不同的错误来源
- pandas 错误:来自 pandas 库
- DataStore 错误:来自 chDB 或 ClickHouse
调试技巧
迁移清单
- 修改 import 语句
- 移除
inplace=True参数 - 在需要 pandas DataFrame 的地方显式添加
to_df() - 如果行顺序很重要,请添加排序
- 使用
to_pandas()进行对比测试 - 使用具有代表性的数据规模进行测试