我一直在尝试使用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
答案 0 :(得分:0)
原来,我所缺少的是;
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)