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和窗口
    datastream.join(stream1).where(<key selector>).equalTo(<key selector>)
    .window(TumblingEventTimeWindow.of(Time.seconds(3)))
    .apply( new JoinFunction(){...});
    //TODO: window join 的原理是如何的?

    2.15 interval join

    用于给定的key和时间范围连接两个DataStream。
    keyedstream.intervalJoin(stream1).between(Time.milliseconds(-2),Time.milliseconds(2))
    .process(new IntervalJoinFunction(){...});
    //TODO: window join 和 interval join 的区别是啥?
作者:admin  创建时间:2023-04-09 22:02
最后编辑:admin  更新时间:2023-04-21 22:56