Flink中两个DataStream的高效压缩(以位置作为隐式键连接)

时间:2016-06-01 12:02:37

标签: apache-flink flink-streaming

我有兴趣使用Apache Flink有效地将两个数据流压缩在一起(但同样的问题也可能适用于数据集)。

作为一个例子(使用Scala表示法)我有

names: DataStream[String]
ages: DataStream[Int]

我想获得

combined: DataStream[(String, Int)]

使用流内数据的位置隐式地进行连接(非正式地:combined(i) = (names(i), ages(i)))。我可以通过向每个流添加“位置”字段然后使用位置作为键将它们连接在一起来获得此功能,但这是非常低效的。

有没有更好的方法呢?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用自定义CoFlatMap功能。为此,您还需要两个内部FIFO缓冲区,因为两种映射方法都将以不可预测的顺序调用(取决于两个输入的数据是否可用)。

因此,您的算法将如下工作(两个地图函数的算法相同):

  1. 在每次调用时,将输入元组追加到自己的缓冲区
  2. 当其他缓冲区和自己的缓冲区不为空时,从每个缓冲区中取一个元组并发出组合元组
  3. 当然,您可以对此算法应用更多优化 - 此版本仅说明了主要想法。