如何为超内存容量的数据集添加并列列(Pandas+ArcticDB)
ArcticDB动态Schema下添加列的正确解决方案
问题说明
设置library_options=LibraryOptions(dynamic_schema=True)后,调用append方法试图为已有数据集添加新列,结果却得到行堆叠、缺失值补0的数据集,而非预期的列合并结果。这是因为append的设计是按行追加数据,要求新数据的首行索引不小于现有数据的末行索引,并非用于列扩展。
若采用先全量读取数据、用Pandasmerge合并后再写入的方式,面对超内存的大型数据集时,会消耗大量内存与时间,且无法持续扩展列。
复现代码
- 创建带动态Schema的Library
from arcticdb import Arctic from arcticdb import LibraryOptions import pandas as pd ac = Arctic('lmdb://D:/Database?map_size=100GB') if 'test' not in ac.list_libraries(): ac.create_library(name='test', library_options=LibraryOptions(dynamic_schema=True))
- 写入初始数据
df = pd.DataFrame( {'column_1': range(1,6)}, index=pd.date_range(start='1/1/2018', end='1/5/2018', name='date') ).reset_index() lib = ac['test'] lib.write('symbol', df, prune_previous_versions=True)
- 错误的列添加方式(行堆叠而非列合并)
to_append_df = pd.DataFrame( {'column_2': range(6,11)}, index=pd.date_range(start='1/1/2018', end='1/5/2018', name='date') ).reset_index() lib.append('symbol', to_append_df)
解决方案
使用ArcticDB的write方法并指定merge=True参数,该参数会在存储层面基于索引匹配自动合并列,无需将全量数据加载到内存,完美适配超大型数据集的列扩展需求。
正确代码示例
# 基于索引匹配实现列合并,无需加载全量数据 lib.write('symbol', to_append_df, merge=True, prune_previous_versions=True) # 验证结果 result_df = lib.read('symbol').data print(result_df)
执行后将得到预期的列合并结果:
| date | column_1 | column_2 |
|---|---|---|
| 2018-01-01 | 1 | 6 |
| 2018-01-02 | 2 | 7 |
| 2018-01-03 | 3 | 8 |
| 2018-01-04 | 4 | 9 |
| 2018-01-05 | 5 | 10 |
关键说明
merge=True仅在dynamic_schema=True的Library中生效,会自动匹配现有数据与新数据的索引,合并新增列的同时保留原有列数据。- 该操作无需加载全量数据到内存,所有合并逻辑在ArcticDB存储层完成,大幅降低内存消耗与处理时间,适合持续添加列的场景。
内容的提问来源于stack exchange,提问作者river7816
相关产品推荐
相关产品推荐

