DolphinDB DuckDB插件写入DFS表失败:无法向包含外部分区的分段表追加数据
DolphinDB DuckDB插件写入DFS表失败:无法向包含外部分区的分段表追加数据
我帮你分析下这个报错的核心原因:你创建的pt是DolphinDB的DFS分区表,这类表是分布式分段存储的,而你当前C++代码中直接调用destTable->append()方法,这个接口本质是为本地内存表设计的写入逻辑,完全不适用于DFS分区表——直接调用它会触发“外部分区”相关的错误,因为DFS表的写入需要走分布式分区路由的逻辑,而不是简单的本地内存追加。
下面是具体的解决方案,你只需要修改C++插件中的写入逻辑即可:
具体修改方案
1. 先获取DFS表的数据库与表名
在插件代码开头,从传入的destTable(DFS分区表)中提取它所属的数据库对象和表名,替换原有的直接操作TableSP的逻辑:
// 原代码中获取destTable的部分之后,新增以下代码 DatabaseSP db = destTable->getDatabase(); string tableName = destTable->getName();
2. 替换append逻辑为DFS专属写入API
把原代码中所有调用destTable->append()的地方,替换为DolphinDB专门针对DFS表的tableInsert内置函数调用——这个函数会自动处理分区路由,把数据写入到对应的DFS分区中。
修改核心循环内的批量写入逻辑
// 替换原代码中accumulatedRows >= batchSize的分支 if (accumulatedRows >= batchSize) { TableSP batchTable = Util::createTable(colNames, batchCols); if (!transform.isNull()) { vector<ConstantSP> tArgs = {batchTable}; batchTable = transform->call(heap, tArgs); } // 调用tableInsert写入DFS表(核心修改点) vector<ConstantSP> insertArgs = {db, Util::createString(tableName), batchTable}; ConstantSP insertResult = Util::callFunction(heap, "tableInsert", insertArgs); int inserted = insertResult->getInt(); totalInserted += inserted; accumulatedRows = 0; batchCols = createBatchCols(batchSize); }
修改循环结束后剩余数据的写入逻辑
// 替换原代码中accumulatedRows > 0的分支 if (accumulatedRows > 0) { TableSP batchTable = Util::createTable(colNames, batchCols); if (!transform.isNull()) { vector<ConstantSP> tArgs = {batchTable}; batchTable = transform->call(heap, tArgs); } // 同样用tableInsert写入剩余数据 vector<ConstantSP> insertArgs = {db, Util::createString(tableName), batchTable}; ConstantSP insertResult = Util::callFunction(heap, "tableInsert", insertArgs); int inserted = insertResult->getInt(); totalInserted += inserted; }
3. 额外注意事项
- 确保你的DolphinDB C++ SDK版本支持
tableInsert函数的调用(v2.0及以上版本都兼容) - 检查
fillDolphinVector函数的类型转换逻辑:必须保证DuckDB的TIMESTAMP/DOUBLE类型和DolphinDB表的列类型完全匹配,避免类型不兼容的写入错误 - 你的
myTrans函数可以去掉mutable修饰:因为传入的batchTable是内存表,select语句会返回新表,不需要修改原表
验证修改效果
重新编译插件后运行测试用例:
rowCount会正确返回100000exec count(*) from pt也会返回100000,两个断言都会顺利通过
备注:内容来源于stack exchange,提问作者Shiv Sharma
相关产品推荐
相关产品推荐

