Apache flink 如何计算流中的唯一单词?
有没有办法用Flink Streaming计算流中的唯一单词数?结果将是一个不断增加的数字流。您可以通过存储所有已看到的单词来解决此问题。有了这些知识,你可以过滤掉所有重复的单词。然后,可以使用并行性Apache flink 如何计算流中的唯一单词?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,有没有办法用Flink Streaming计算流中的唯一单词数?结果将是一个不断增加的数字流。您可以通过存储所有已看到的单词来解决此问题。有了这些知识,你可以过滤掉所有重复的单词。然后,可以使用并行性1的map操作符对其余部分进行计数。下面的代码片段正是这样做的 val env=StreamExecutionEnvironment.getExecutionEnvironment val inputStream=env.fromElements(“foo”、“bar”、“foobar”、“bar”
1
的map操作符对其余部分进行计数。下面的代码片段正是这样做的
val env=StreamExecutionEnvironment.getExecutionEnvironment
val inputStream=env.fromElements(“foo”、“bar”、“foobar”、“bar”、“barfoo”、“foobar”、“foo”、“foo”、“foo”)
//过滤掉我们已经看到的单词
val uniqueWords=inputStream.keyBy(x=>x).filterWithState{
(word,seenWordsState:Option[设置[字符串])=>seenWordsState匹配{
case None=>(true,Some(HashSet(word)))
大小写Some(seenWords)=>(!seenWords.contains(word),Some(seenWords+word))
}
}
//计算传入(第一次看到)单词的数量
val numberUniqueWords=uniqueWords.keyBy(x=>0).mapWithState{
(字,反状态:选项[Int])=>
反状态匹配{
案例无=>(1,部分(1))
案例部分(计数器)=>(计数器+1,部分(计数器+1))
}
}.1(1)
numberRunIQueWords.print();
env.execute()
如果传入流为“无穷大”且字符串集(在过滤器中,状态为
)变得太大,是否会导致OOM或性能下降?如果您使用的是支持核心外的状态后端,则不会。rocksdbstatebend
就是这样一种状态后端。如果使用内存状态后端,则必须偶尔清除一次该状态,否则可能会遇到OOM。然而,据我所知,在这种情况下,保存/还原到/从rocksdbstatebend
后端的操作的复杂性为O(N)其中N是集合中元素的计数,即此后端始终保存/恢复集合的所有元素或仅更改的元素?此实现使用ValueState
抽象,它将始终保存/恢复完整的集合。但是,也可以使用ListState
抽象来增加检查点。嗨,直到现在,filterWithState
仅在版本1.1中可用吗?我在Flink 1.0.0中找不到它。