在Roxie集群使用KEYDIFF/KEYPATCH遇未实现错误的技术求助
KEYDIFF/KEYPATCH无法在Roxie集群使用的原因及替代思路
核心结论
KEYDIFF和KEYPATCH是Thor集群专属功能,Roxie(包括hthor)并未实现该特性,这就是触发"System error: -1: UNIMPLEMENTED activity 'keydiff'"报错的直接原因。
这类操作是针对Thor的分布式数据处理架构设计的,而Roxie的定位是低延迟查询引擎,其运行环境和执行逻辑不支持这类索引差异计算与补丁操作。
针对"减少Thor到Roxie数据传输量"的替代方案
- 在Thor集群上完成KEYDIFF操作生成差异文件,再将差异文件同步到Roxie,通过自定义逻辑将差异数据合并到现有Roxie索引中(例如读取差异数据集后,与原有数据集合并重建索引)
- 利用Roxie的增量加载特性,直接将Thor中新增/修改的数据集发布为Roxie的增量数据源,避免全量传输;若使用HPCC Systems新版本,可结合Logical Files管理多版本数据集,实现更高效的增量同步
- 若索引更新频率较低,可在Thor生成优化后的完整索引,通过HPCC自带的文件同步机制将索引文件同步到Roxie,相比全量数据集传输,索引文件体积通常更小
测试代码
rec:= RECORD string10 name; unsigned2 age; END; /* ds1 := DATASET([{'Name1',10},{'Name2',20}],{rec}); ds2 := DATASET([{'Name1',10},{'Name2',20},{'Name3',20}],{rec}); a := output(ds1,,'~BMFtest::file1',overwrite); b := output(ds2,,'~BMFtest::file2',overwrite); a; b; */ newds1 := dataset('~BMFtest::file1',{rec,UNSIGNED8 recpos {virtual(fileposition)}},thor); newds2 := dataset('~BMFtest::file2',{rec,UNSIGNED8 recpos {virtual(fileposition)}},thor); //newds1; //newds2; i1 := INDEX(newds1,{name,recpos},'~BMFtest::file1_idx'); i2 := INDEX(newds2,{name,recpos},'~BMFtest::file2_idx'); C := buildindex(i1); d := buildindex(i2); // SEQUENTIAL(PARALLEL(A,B),PARALLEL(C,D)); //BUILD THIS FIRST, THEN RUN KEYDIFF KEYDIFF(i1,i2,'~BMFtest::DIFF::i1i2',OVERWRITE);
内容的提问来源于stack exchange,提问作者Lucas-Varella
相关产品推荐
相关产品推荐

