如何处理Flink的Table API窗口中的后期元素?

时间:2019-06-19 11:58:12

标签: scala apache-flink

在使用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本地处理这些后期元素?

3 个答案:

答案 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"

regularSourcelateSource是稍后分别处理的新流。在使用这种方法之前,我们遇到了一些重复。 isLate()函数是一个自定义函数,它确定元素是否可能迟到。在我的情况下,此功能使用BoundedOutOfOrdernessTimestampExtractor.getCurrentWatermark.getTimestamp提供的当前水印信息。