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)的方法,可让您执行相同的操作!
这两种方式有什么区别?他们是否使用相同的较低层结构?它们的价格一样吗?我们何时以及如何选择其中之一?
答案 0 :(得分:2)
split
运算符自DataStream API成立之初就是其一部分。侧面输出功能将在以后添加,并提供split
功能的超集。
split
创建多个相同类型的流,即输入类型。侧面输出可以是任何类型,即也可以与输入和主输出不同。
在内部,split
添加了仅用于分割流的专用运算符。侧面输出在使用任意逻辑并具有多个输出功能的运算符(通常为ProcessFunction
或窗口运算符)中定义。我不希望这会导致明显的性能差异。
侧边输出的一个常见用例是过滤掉无效(或较晚)的记录,并将它们未经修改地传递给侧边,例如,稍后再处理它们。这样的运算符具有带有期望结果类型的常规输出和带有其输入类型的侧面输出。使用split
来实现此逻辑会很麻烦。
答案 1 :(得分:1)
split
和side outputs之间的一个重要区别是 def sort(path):
inFile= open(path, 'r')
inFile1= open(path, 'r')
copy = False
outFile = open('mom.txt', 'w')
outFile1 = open('dad.txt', 'w')
keepCurrentSetDad = False
keepCurrentSetMom = False
for line in inFile:
print("--->",line)
if 'Dad' in line:
keepCurrentSetDad = True
keepCurrentSetMom = False
continue
elif 'Mom' in line:
keepCurrentSetMom = True
keepCurrentSetDad = False
continue
if keepCurrentSetDad:
outFile1.write(line)
elif keepCurrentSetMom:
outFile.write(line)
outFile.close()
outFile1.close()
inFile1.close()
is deprecated而侧面输出不是。
Flink的split
manual的引用:
split