Apache Flink具有一个split
API,可用于分支数据流:
val splited = datastream.split { i => i match {
case i if ... => Seq("red", "blue")
case _ => Seq("green")
}}
splited.select("green").flatMap { .... }
它还提供了另一种称为Side Output的方法(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/stream/side_output.html),使您可以执行相同的操作!
这两种方式有什么区别?他们是否使用相同的较低层结构?它们的价格一样吗?我们何时以及如何选择其中之一?
split
自成立以来,该操作员便是DataStream API的一部分。侧面输出功能将在以后添加,并提供split
的功能的超集。
split
创建多个相同类型(输入类型)的流。侧面输出可以是任何类型,即也可以不同于输入和主输出。
在内部,split
添加仅用于分割流的专用运算符。侧面输出是在运算符(通常是ProcessFunction
或窗口运算符)中定义的,该运算符应用任意逻辑并具有多个输出。我不希望这会导致明显的性能差异。
侧面输出的一个常见用例是过滤掉无效(或较晚)的记录,并将它们未经修改地传递给侧面,例如,稍后再处理它们。这样的运算符具有期望结果类型的常规输出和输入类型的侧面输出。使用来实现该逻辑会很麻烦split
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句