Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink 如何计算流中的唯一单词?_Apache Flink_Flink Streaming - Fatal编程技术网

Apache flink 如何计算流中的唯一单词?

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”

有没有办法用Flink Streaming计算流中的唯一单词数?结果将是一个不断增加的数字流。

您可以通过存储所有已看到的单词来解决此问题。有了这些知识,你可以过滤掉所有重复的单词。然后,可以使用并行性
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中找不到它。