2.1 flatMap
处理一个输入元素,但是要输出一个或者多个输出元素的时候,就可以用到flatMap()。
栗子:
dataStream.flatMap(new FlatMapFunction<String, Tuple2<String, String>>() {
@Override
public void flatMap(String s, Collector<Tuple2<String, String>> collector) throws Exception {
JSONObject jo = JSON.parseObject(s);
collector.collect(Tuple2.of(jo.getString("content_id").split("[|]")[0], jo.getString("type")));
}
})
FlatMapFunction<T,O>
T - Type of the input elements.
O - Type of the returned elements.
其中T为输入类型,O为输出类型
2.2 map
Map操作实现的是一对一映射,即自定义的MapFunction函数必须返回一个元素。适用于解析元素、转换数据类型等。
栗子:
doc2Send.map((MapFunction<Tuple2<String, Long>, String>) value -> {
JSONObject object = new JSONObject();
object.put("content_id", value.f0);
object.put("ts", value.f1);
return object.toJSONString();
})
MapFunction<T,O>
T - Type of the input elements.
O - Type of the returned elements.
其中T为输入类型,O为输出类型
2.3 keyBy
栗子1:
FlatMapParse.keyBy(new KeySelector<Tuple3<String, String, Long>, String>() {
@Override
public String getKey(Tuple3<String, String, Long> value) throws Exception {
return value.f1 + "##" + value.f0;
}
})
栗子2:
dataStream.keyBy((KeySelector<String, String>) value -> {
JSONObject valueJson = JSONObject.parseObject(value);
return valueJson.getString("content_id");
})
该方法不会生成算子,但是仍然会生成Transformation。
Flink的分区方式包括以下几种:
- rebalance:重分区,保证下游每个分区负载均衡,用于平衡数据。
- broadcast:广播分区,将输出的每条数据都发送到下游所有分区。
- shuffle:随机分区,将数据随机分配到下游分区。
- forward:本地分区,将数据分发到本地分区。
- rescale:重新缩放分区。如 上游分区2 下游分区4 则1个上游分发给2个下游分区,另1个上游给另外两个下游分区。
- global:全局分区,所有数据进入下游第一个分区。
2.4 aggregation
用于聚合计算。
栗子:
该算子只针对某个键的,如果要求全局的最大值、最小值,该方法无法用。keyedStream.sum(0); keyedStream.sum("key"); //还有 min max maxBy minBy
2.5 filter
栗子:q
2.6 reduce
栗子:q
2.7 split
栗子:q
2.8 select
栗子:q
2.9 union
用于将多个datastream合并在一起
栗子:datastream.union(stream1,stream2...)
2.10 connect
栗子:q
2.11 coMap
栗子:q
2.12 coFlatMap
栗子:q
2.13 iterate
栗子:q
2.14 window join
用于关联两个datastream,通过指定的key和窗口
//TODO: window join 的原理是如何的?datastream.join(stream1).where(<key selector>).equalTo(<key selector>) .window(TumblingEventTimeWindow.of(Time.seconds(3))) .apply( new JoinFunction(){...});
2.15 interval join
用于给定的key和时间范围连接两个DataStream。
//TODO: window join 和 interval join 的区别是啥?keyedstream.intervalJoin(stream1).between(Time.milliseconds(-2),Time.milliseconds(2)) .process(new IntervalJoinFunction(){...});
作者:admin 创建时间:2023-04-09 22:02
最后编辑:admin 更新时间:2023-04-21 22:56
最后编辑:admin 更新时间:2023-04-21 22:56