【问题标题】:Apache Flink: Using filter() or split() to split a stream?Apache Flink:使用 filter() 或 split() 拆分流?
【发布时间】:2019-07-24 23:18:03
【问题描述】:

我有一个来自 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()

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

【问题讨论】:

  • 我建议不要使用split。也许我做错了什么,但在我当前的项目中env.execute() 在使用拆分时抛出了奇怪的异常。然后我用filter替换了split,它解决了我的问题。

标签: apache-flink flink-streaming


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    DataStream 中的SplitStreams 和split 方法自Flink Deprecated List 1.6 起已弃用。不再推荐使用。

    【讨论】:

    • 那么应该改用什么?我想根据字段值“拆分”我的流,这将导致我拥有两个不同的流,我以后可以以不同的方式处理它们。
    • @Kristoff 您可以使用filter 转换,如上所示。您在具有不同条件(例如 >0、DataSet
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多