我对使用 Apache Flink 有效地将两个数据流压缩在一起感兴趣(但同样的问题也可能适用于数据集)。
作为一个例子(使用 Scala 符号),我有
names: DataStream[String]
ages: DataStream[Int]
我想获得
combined: DataStream[(String, Int)]
其中,连接是使用流中数据的位置隐式进行的(非正式地:combined(i) = (names(i), ages(i))
)。我可以通过向每个流添加一个"位置"字段,然后使用位置作为键将它们连接在一起来获得这一点,但这效率很低。
有没有更好的方法可以做到这一点?谢谢!
自定义CoFlatMap
函数。为此,您还需要两个内部FIFO缓冲区,因为这两个映射方法都将以不可预测的顺序调用(取决于两个输入的数据何时可用)。
因此,您的算法将按如下方式工作(两个映射函数的算法相同):
- 在每次调用时,将输入元组附加到自己的缓冲区
- 当其他缓冲区和自己的缓冲区不为空时,从每个缓冲区中获取一个元组并发出组合元组
当然,您可以对此算法应用更多优化 - 此版本仅说明主要思想。