Apache Flink:使用 filter() 或 split() 拆分流?
Apache Flink: Using filter() or split() to split a stream?
我有一个来自 Kafka 的数据流,它对 MyModel 中的一个字段有 2 个可能的值。 MyModel 是一个 pojo,其中包含从来自 Kafka 的消息中解析的特定域字段。
DataStream<MyModel> stream = env.addSource(myKafkaConsumer);
我想分别在每个键 a1、a2 上应用 window 和运算符。什么是分离它们的好方法?我有 2 个选项过滤器和 select,但不知道哪个更快。
过滤方法
stream
.filter(<MyModel.a == a1>)
.keyBy()
.window()
.apply()
.addSink()
stream
.filter(<MyModel.a == a2>)
.keyBy()
.window()
.apply()
.addSink()
分裂和select接近
SplitStream<MyModel> split = stream.split(…)
split
.select(<MyModel.a == a1>)
…
.addSink()
split
.select<MyModel.a == a2>()
…
.addSink()
如果split和select比较好,如果我想根据MyModel中某个字段的值进行split怎么实现?
两种方法的行为几乎相同。在内部,split()
运算符分叉流并应用过滤器。
还有第三种选择,Side Outputs 。侧输出可能有一些好处,例如不同的输出数据类型。此外,过滤条件只对侧输出评估一次。
SplitStreams and split method in DataStream are deprecated since Flink Deprecated List 1.6。不再推荐使用
我有一个来自 Kafka 的数据流,它对 MyModel 中的一个字段有 2 个可能的值。 MyModel 是一个 pojo,其中包含从来自 Kafka 的消息中解析的特定域字段。
DataStream<MyModel> stream = env.addSource(myKafkaConsumer);
我想分别在每个键 a1、a2 上应用 window 和运算符。什么是分离它们的好方法?我有 2 个选项过滤器和 select,但不知道哪个更快。
过滤方法
stream
.filter(<MyModel.a == a1>)
.keyBy()
.window()
.apply()
.addSink()
stream
.filter(<MyModel.a == a2>)
.keyBy()
.window()
.apply()
.addSink()
分裂和select接近
SplitStream<MyModel> split = stream.split(…)
split
.select(<MyModel.a == a1>)
…
.addSink()
split
.select<MyModel.a == a2>()
…
.addSink()
如果split和select比较好,如果我想根据MyModel中某个字段的值进行split怎么实现?
两种方法的行为几乎相同。在内部,split()
运算符分叉流并应用过滤器。
还有第三种选择,Side Outputs 。侧输出可能有一些好处,例如不同的输出数据类型。此外,过滤条件只对侧输出评估一次。
SplitStreams and split method in DataStream are deprecated since Flink Deprecated List 1.6。不再推荐使用