1、使用步骤
1)创建 IterativeStream;
2)对 IterativeStream 调用算子进行计算;
3)注册 iterativeStream 的迭代终止条件;
2、代码实现
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.IterativeStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class IterativeCalculationDemo {
public static void main(String[] args) throws Exception {
// 获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 从端口获取数据
DataStreamSource<String> line = env.socketTextStream("localhost", 8888);
// 将数据转换为long
SingleOutputStreamOperator<Long> longStream = line.map(Long::parseLong);
// 使用迭代计算
IterativeStream<Long> iterativeStream = longStream.iterate();
// 迭代中进行的计算
SingleOutputStreamOperator<Long> streamOperator = iterativeStream.map(new MapFunction<Long, Long>() {
@Override
public Long map(Long input) throws Exception {
return input - 1;
}
});
// 添加迭代终止的条件
SingleOutputStreamOperator<Long> closeFilter = streamOperator.filter(new FilterFunction<Long>() {
@Override
public boolean filter(Long input) throws Exception {
return input > 0;
}
});
iterativeStream.closeWith(closeFilter);
// 输出大于0的结果
streamOperator.filter(e -> e > 0).print();
env.execute("iterate");
}
}
3、执行结果
1)输入测试数据
nc -lk 8888
10
输出结果:
3> 9
3> 8
3> 7
3> 6
3> 5
3> 4
3> 3
3> 2
3> 1