Flink迭代操作末文-迭代流

Flink作为优秀的流处理框架,自有其独到之处,比如我们前面讲了:

flink的神奇分流器-sideoutput

这个可以用来分流,很方便的一次就可以对数据进行筛选返回。

还有针对算法处理的迭代操作,我们已经讲过两篇文章了:

Flink特异的迭代操作-bulkIteration

不得不会的Flink Dataset的DeltaI迭代操作

一个是全量迭代,一个是增量迭代。

还有优秀又鸡肋的watermark机制

不懂watermark?来吧~

对于迭代操作,其实还有一讲,那就是流处理的迭代操作。那么本文就针对这个进行分析~

Flink的迭代流程序实际就是实现了一个步进函数,然后将其嵌入到IterativeStream内部。要知道FlinkDatastream正常情况下是不会结束的,所以也没有所谓的最大迭代次数。这种情况下,你需要自己指定哪个类型的数据需要回流去继续迭代,哪个类型的数据继续向下传输,这个分流的方式有两种:splitfilter,官方网站在介绍迭代流的时候使用的是filter。我们这里就先按照官网的介绍走,然后案例展示的时候使用split给大家做个demo

首先,要创建一个IterativeStream

 
 

IterativeStream<Integer> iteration =input.iterate(); 

接着就可以定义对该留要进行的逻辑操作,官网这里就很简单的举了一个map的例子。

 
 

DataStream<Integer> iterationBody =iteration.map(/* this is executed many times */);

调用IterativeStreamcloseWith(feedbackStream)方法可以对迭代流进行闭环操作。传递给closeWith函数的DataStream会返回值迭代的头部。常用的做法是用filter来分离流的向后迭代的部分和向前传递的部分。。

 
 

iteration.closeWith(iterationBody.filter(/*one part of the stream */));

DataStream<Integer> output =iterationBody.filter(/* some other part of the stream */);

官方给了一个连续不断减1直到数据为零的例子:

 
 

DataStream<Long> someIntegers =env.generateSequence(0, 1000);

// 创建迭代流

IterativeStream<Long> iteration =someIntegers.iterate();

// 增加处理逻辑,对元素执行减一操作。

DataStream<Long> minusOne =iteration.map(new MapFunction<Long, Long>() {

@Override

public Long map(Long value) throws Exception {

  return value - 1 ;

 }

});

// 获取要进行迭代的流,

DataStream<Long> stillGreaterThanZero= minusOne.filter(new FilterFunction<Long>() {

@Override

public boolean filter(Long value) throws Exception {

  return (value > 0);

 }

});

// 对需要迭代的流形成一个闭环

iteration.closeWith(stillGreaterThanZero);

// 小于等于0的数据继续向前传输

DataStream<Long> lessThanZero =minusOne.filter(new FilterFunction<Long>() {

@Override

public boolean filter(Long value) throws Exception {

  return (value <= 0);

 }

});

刚刚分享了一套kylin课程,欢迎与490+好友一起学习

640?wx_fmt=jpeg

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值