使用coGroup的Apache Flink实现左外连接

时间:2018-07-16 09:33:15

标签: scala apache-flink

我一直在尝试使用Flink中的CoGroupFunction来加入两个流。

我有两个视频流;哪些;

S1

val m = env
.addSource(new FlinkKafkaConsumer010[String]("topic-1", schema, props))
.map(gson.fromJson(_, classOf[Master]))
.assignAscendingTimestamps(_.time)

S2

val d = env
.addSource(new FlinkKafkaConsumer010[String]("topic-2", schema, props))
.map(gson.fromJson(_, classOf[Detail]))
.assignAscendingTimestamps(_.time)

我的coGroup实现是;

class MasterDetailOuterJoin extends CoGroupFunction[Master, Detail, 
(Master, Option[Detail])] {

  override def coGroup(
      leftElements : java.lang.Iterable[Master],
      rightElements: java.lang.Iterable[Detail],
      out: Collector[(Master, Option[Detail]) ]): Unit = {

    for (leftElem <- leftElements) {
      var isMatch = false
      println(leftElem.orderNo)
      for (rightElem <- rightElements) {
        println(rightElem.orderNo)
        out.collect((leftElem, Some(rightElem)))
        isMatch = true
      }
      if (!isMatch) {
        out.collect((leftElem, None))
      }
    }
  }
}

我用它来运行它

m.coGroup(d)
    .where(_.orderNo)
    .equalTo(_.orderNo)
    .window(TumblingEventTimeWindows.of(Time.of(5, TimeUnit.SECONDS)))
    .apply(new MasterDetailOuterJoin)
    .map(gson.toJson(_, classOf[(Master, Option[Detail])]))
    .print

但是即使在主旨和细节上都匹配,也不会打印任何内容! 我通过控制台使用者监视kafka流,顺便说一句。

如果我使用内部联接进行操作,则会得到结果。

 m.keyBy(_.orderNo)
    .connect(d.keyBy(_.orderNo))
    .flatMap(new MasterDetailInnerJoin) //RichCoFlatMapFunction
    .map(gson.toJson(_, classOf[(Master, Detail)]))
    .print

1 个答案:

答案 0 :(得分:0)

原来,我所缺少的是;

  • env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
  • 并为每个流分配时间戳和水印提取器