在使用Flink 1.55及其表API的流应用程序中,我需要检测并处理后期元素。我找不到DataStream API .sideOutputLateData(...)
的功能的替代方法我尝试在Flink文档https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/table/tableApi.html中进行搜索,并在Google上搜索了很多内容,但没有发现有用的信息
示例:
func AddNumber(number int, node *Node) *Node {
if node == nil {
log.Fatal("No Node provided")
}
var newNode Node
for n := node; n != nil; n = n.next {
if n.next == nil {
newNode = Node{number, n, nil}
n.next = &newNode
break
}
}
return &newNode
}
提供的代码按预期工作。问题是,如窗口大小和允许的延迟所定义的,延迟到达的元素将被丢弃。 有没有办法通过Table API本地处理这些后期元素?
答案 0 :(得分:0)
从Flink 1.8.0开始,Table API当前似乎不直接支持此功能。解决该问题的一种方法是将表转换为NULL
并在其上设置侧面输出:
DataStream[Row]
答案 1 :(得分:0)
我找到了一个解决方案。我当前正在使用BoundedOutOfOrdernessTimestampExtractor,它提供水印时间戳信息。我使用这些信息来拆分输入流并分别处理后流。
答案 2 :(得分:0)
这是拆分的代码示例:
val mainSource = env.addSource(someSource)
val splitted = mainSource.split(
(x:DataKpi)=> isLate(x.getTimestamp) match {
case false =>List("regular")
case true =>List("late")
}
)
val regularSource= splitted select "regular"
val lateSource= splitted select "late"
regularSource
和lateSource
是稍后分别处理的新流。在使用这种方法之前,我们遇到了一些重复。 isLate()
函数是一个自定义函数,它确定元素是否可能迟到。在我的情况下,此功能使用BoundedOutOfOrdernessTimestampExtractor.getCurrentWatermark.getTimestamp
提供的当前水印信息。