开发者社区> 问答> 正文

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

我有一个来自Kafka的DataStream,它对MyModel中的一个字段有两个可能的值。MyModel是一个pojo,其中包含来自Kafka的消息解析的特定于域的字段。

DataStream 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 split = stream.split(…)

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

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

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

展开
收起
flink小助手 2018-12-13 14:20:47 9685 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    两种方法的表现几乎相同。在内部,split()操作员也会分叉流并应用过滤器。

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

    2019-07-17 23:20:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Apache Flink技术进阶 立即下载
Apache Spark: Cloud and On-Prem 立即下载
Hybrid Cloud and Apache Spark 立即下载

相关镜像