本篇文章是StreamSet的进阶篇,主要讲述其流的拆分和合并的用法。
StreamSet的理解
持续使用了StreamSet软件一段时间,对其理解越来越深了,其软件命名为StreamSet,可简单翻译为流集合,的确,其软件正式流的集合,处理来自源的流集合,对流集合进行拆解,合并,转到下一个组件进行加工,然后再次流转,最终流向目的地。理解它的含义,就理解了其设计的初衷,也能从中领悟其用法设计的局限和目的。
Record集
记录来自各个源,ftp、http、redis等,来自这些源的有json,xml或其他各式迥异的文本或二进制,StreamSet支持很多种方式,列举如下:
- Avro
- Binary
- Datagram
- CSV,或按分隔符分隔的文本
- Json
- Protobuf
- SDC Record
- XML
Record包含头属性,其会自动设置源的一些特性,诸如文件名、http头等信息,你可以利用Javascript或表达式设置其他头属性。
Record集根据源的信息各式拆分的不同,可以形成单个Record或多个Record。
对多个流Record的拆分
可以理解为对这个Record集合数组的拆分吧,严格来说可能还是有区别,对于理解这就足够了。
之前也有涉及到,最重要的是 “Stream Selector”组件,其可以按照判断条件拆分多个Record为几个不同的子集。
如上,判断条件如下所示。
${record:value('/data/flag')}
对单个Record的某字段进行拆分
单个Record数据,有时候包含数组或列表集合,我们想把它们拆分成多个Record,可以利用“Field Pivot”组件进行拆分。
指定拆分的字段一定是数组或列表,否则会出错哦。
这里指定一个字段Items为拆分字段。
/Order/Items
对多个Record进行合并
有分就有合,三国曾说过分久必合合久必分!
然而,我并没有发现有合并的组件,以后发现了会补充上来的。
那这这这可怎么办,我要用啊,老大?
好吧,先使用神器Javascript吧。
以下代码仅供参考,你需要根据实际需要进行改造!
// Sample JavaScript code
var items = [];
var success = true;
for(var i = 0; i < records.length; i++) {
try {
items.push(records[i].value['Order']['Items']['Item']);
if(i == 0){
records[i].value['Order']['Items'] = [];
records[i].value['Order']['OrderLines'] = [];
records[i].value['Order']['OrderLines'].push({'OrderLineItems':items});
}
//output.write(records[i]);
} catch (e) {
// Send record to error
success = false;
for(var j=0;j<i;j++){
output.write(records[i]);
}
error.write(records[i], e);
break;
}
}
if(success && records.length>0){
output.write(records[0]);
}
结语
知道的越多,越觉得自己的无知!学习无止境,这个软件整体做的非常不错!
在此我向大家推荐一个微服务架构学习交流群。交流学习QQ群号:864759589 里面会分享一些资深架构师录制的视频录像:高并发、高性能、分布式、微服务架构的原理,分布式架构等这些成为架构师必备的知识体系。