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

时间:2018-12-03 06:28:21

标签: apache-flink flink-streaming

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

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

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

过滤方法

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

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

拆分并选择方法

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

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

如果分割和选择更好,如果我想根据MyModel中的字段值进行分割,如何实现它们?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

SplitStream起,split中的

DataStreamFlink Deprecated List 1.6方法已被弃用。不再建议使用。