数据对接-ETL之StreamSet学习之旅五

本篇文章是StreamSet的进阶篇,主要讲述其流的拆分和合并的用法。

StreamSet的理解

持续使用了StreamSet软件一段时间,对其理解越来越深了,其软件命名为StreamSet,可简单翻译为流集合,的确,其软件正式流的集合,处理来自源的流集合,对流集合进行拆解,合并,转到下一个组件进行加工,然后再次流转,最终流向目的地。理解它的含义,就理解了其设计的初衷,也能从中领悟其用法设计的局限和目的。

Record集

记录来自各个源,ftp、http、redis等,来自这些源的有json,xml或其他各式迥异的文本或二进制,StreamSet支持很多种方式,列举如下:

  1. Avro
  2. Binary
  3. Datagram
  4. CSV,或按分隔符分隔的文本
  5. Json
  6. Protobuf
  7. SDC Record
  8. 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 里面会分享一些资深架构师录制的视频录像:高并发、高性能、分布式、微服务架构的原理,分布式架构等这些成为架构师必备的知识体系。
在这里插入图片描述


引用链接

  1. 口袋代码仓库
  2. 在线计算器
  3. 本节源码:github

猜你喜欢

转载自blog.csdn.net/webmote/article/details/85258033