flatmap,map,filter都是转换,通过datastream的transform方法。以最经典的flatmap为例,transform,需要三个参数,操作名字,输出类型,对输入数据的操作。返回
SingleOutputStreamOperator,是datastream的子类,也就是可以链式的调用。返回一个OneInputTransformation。是StreamTransformation的子类。
也就是说,map,flatmap,filter等用到了transform的datastream上的操作,只是生产一个StreamTransformation,每个StreamTransformation都保存着上个StreamTransformation的引用input,相当于一个带有parentId的StreamTransformation的tree
也就是说。通过datastream的链式调用,就是在绘制这个StreamTransformation的tree的过程。
每个StreamTransformation都保存了。INPUT,OUTPUT的数据类型,和具体的转换逻辑StreamOperator。
最后绘制的这个转换的tree,由StreamGraphGenerator来绘制。
结论就是一个tranformation,持有上一个transformation的引用,和子集的operator逻辑(join时候有多个operator,单流时有一个)。和并发度,buffertimeout等具体计算节点的上下文。
从operator的接口来看,除了要处理数据外,还要处理WATERMARK。也就是数据在流的过程中,会有WATERMARK伴随着一起。而map,flat,filter等纯计算的并不关心WATERMARK,而是直接转发给下一步。
public <R> SingleOutputStreamOperator<R> flatMap(FlatMapFunction<T, R> flatMapper) {
TypeInformation<R> outType = TypeExtractor.getFlatMapReturnTypes(clean(flatMapper),
getType(), Utils.getCallLocationName(), true);
return transform("Flat Map", outType, new StreamFlatMap<>(clean(flatMapper)));
}
@PublicEvolving
public <R> SingleOutputStreamOperator<R> transform(String