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

Son*_*Son 5 apache-flink flink-streaming

我有一个来自 Kafka 的 DataStream,它对 MyModel 中的一个字段有 2 个可能的值。MyModel 是一个 pojo,具有从来自 Kafka 的消息解析的特定领域字段。

DataStream<MyModel> stream = env.addSource(myKafkaConsumer);
Run Code Online (Sandbox Code Playgroud)

我想分别在每个键 a1、a2 上应用窗口和运算符。有什么好的方法可以将它们分开?我有 2 个选项过滤和选择,但不知道哪个更快。

过滤方法

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

stream
        .filter(<MyModel.a == a2>)
        .keyBy()
        .window()
        .apply()
        .addSink()
Run Code Online (Sandbox Code Playgroud)

拆分和选择方法

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

    split
        .select<MyModel.a == a2>()
        …
        .addSink()
Run Code Online (Sandbox Code Playgroud)

如果 split 和 select 更好,如果我想根据 MyModel 中某个字段的值进行拆分,如何实现它们?

Fab*_*ske 6

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

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