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
实现这个逻辑会很麻烦.
关于apache-flink - Apache Flink : What's the difference between side outputs and split() in the DataStream API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51440677/