Apache Flink:使用 filter() 或 split() 拆分流?

Apache Flink: Using filter() or split() to split a stream?

我有一个来自 Kafka 的数据流,它对 MyModel 中的一个字段有 2 个可能的值。 MyModel 是一个 pojo,其中包含从来自 Kafka 的消息中解析的特定域字段。

DataStream<MyModel> stream = env.addSource(myKafkaConsumer);

我想分别在每个键 a1、a2 上应用 window 和运算符。什么是分离它们的好方法?我有 2 个选项过滤器和 select,但不知道哪个更快。

过滤方法

stream
        .filter(<MyModel.a == a1>)
        .keyBy()
        .window()
        .apply()
        .addSink()

stream
        .filter(<MyModel.a == a2>)
        .keyBy()
        .window()
        .apply()
        .addSink()

分裂和select接近

SplitStream<MyModel> split = stream.split(…)
    split
        .select(<MyModel.a == a1>)
        …
        .addSink()

    split
        .select<MyModel.a == a2>()
        …
        .addSink()

如果split和select比较好,如果我想根据MyModel中某个字段的值进行split怎么实现?

两种方法的行为几乎相同。在内部,split() 运算符分叉流并应用过滤器。

还有第三种选择,Side Outputs 。侧输出可能有一些好处,例如不同的输出数据类型。此外,过滤条件只对侧输出评估一次。

SplitStreams and split method in DataStream are deprecated since Flink Deprecated List 1.6。不再推荐使用