Apache Flink: 使用filter()还是split()来拆分流?

11

我从Kafka获得了一个DataStream,其中MyModel的一个字段有两种可能的值。MyModel是一个POJO对象,它包含从Kafka消息中解析出来的领域特定的字段。

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

我希望您能为a1和a2键分别应用窗口和操作符。有什么好方法可以将它们分开处理吗?我考虑了两个选项:过滤器和选择器,但不知道哪种更快。 过滤器方法
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字段的值进行拆分的情况下实现它们?

我建议不要使用split。也许是我做错了什么,但在我的当前项目中,当使用split时,env.execute()会抛出奇怪的异常。然后我用filter替换了split,问题就解决了。 - bolei
2个回答

11

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

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


5

那么应该使用什么替代呢? 我想要根据字段值“拆分”我的流,这将导致我拥有两个不同的流,我可以以不同的方式处理它们。 - Kristoff
@Kristoff,你可以像上面演示的那样使用“filter”转换。你在“input”流上调用它两次,使用不同的条件(例如>0、<=0),有效地拆分数据流。这对于DataSet也适用。 - h4nek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接