当前位置: 首页 > 知识库问答 >
问题:

如何使用Flink计算时间窗口流中的唯一单词?

姬英耀
2023-03-14

有没有办法用 Flink Streaming 计算时间窗口流中唯一单词的数量?我看到这个问题,但我不知道如何实现时间窗口。

共有1个答案

刘奇
2023-03-14

当然,这很简单。如果您希望在每个时间窗口内对所有输入记录进行聚合,那么您将需要使用windowAll()的一种风格,这意味着您将不会使用keyedstream,并且您不能并行操作。

您需要决定是要滚动窗口还是滑动窗口,以及是在事件时间还是在处理时间进行操作。

但是粗略地说,你会做这样的事情:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource( ... )
    .timeWindowAll(Time.minutes(15))
    .apply(new UniqueWordCounter())
    .print()
env.execute()

您的 UniqueWordCounter 将是一个 WindowFunction,它接收窗口中所有单词的可迭代,并返回唯一单词的数量。

另一方面,如果您使用的是键控流,并且想要计算每个键的唯一单词,请相应地修改应用程序:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource( ... )
    .keyBy( ... )
    .timeWindow(Time.minutes(15))
    .apply(new UniqueWordCounter())
    .print()
env.execute()
 类似资料:
  • 的结果是一个元素流-因此,我希望从这个流中获得一个“具有最高计数的key”的更新流。 然后我通过一个常量(-因为这是一个全局操作)进行键控,并使用-这几乎可以实现:我得到一个最高计数流,但当前的最高计数是针对每个元素发出的。 我想我要找的是某种带有前一个值的过滤器,它只会在新值与前一个值不同时才会发出元素。 目前在Flink有可能吗?

  • 我可否问一问作出决定的理由是什么?我是否可以推断,如果数据的到达非常不规则(50%进入定义的窗口长度,而其他50%没有),窗口方法的结果更有偏差(因为50%的事件被丢弃)? 另一方面,在使用状态时,我们是否花费更多的时间检查和更新状态?

  • 在Apache Flink中使用滑动时间窗口时,当窗口滑动时会重新计算窗口中的许多元组/元素。例如,假设一个窗口大小为5秒,滑动时间为1秒,则窗口内容的80%与上一个窗口的内容相同。 考虑一个数据流S,其元组由时间戳和整数值组成: , , , , , , ,... 假设t1、t2、t3、...表示连续时间戳,其中t2-t1=1秒。给定S,窗口大小为5秒、滑动1秒的Flink窗口化ProcessWi

  • 我正在研究一个Flink流式处理器,它可以从Kafka读取事件。这些事件由其中一个字段键控,并且在减少和输出之前应该在一段时间内加窗。我的处理器使用事件时间作为时间特性,因此从它所消耗的事件中读取时间戳。以下是它目前的样子: 我所知道的事件如下: null null