我正在尝试Apache Flink,并通过学习来测试我的知识,我正在研究经典的字数统计问题。
这是我的代码:
public class TestWordCount {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
DataStreamSource<String> addSource = env.addSource(new TestSource());
DataStream<Tuple2<String, Integer>> sum = addSource
.flatMap(new Tokenizer())
.keyBy(0)
.sum(1);
sum.print();
env.execute();
}
}
class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {
private static final long serialVersionUID = 1L;
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
for(String part: value.split(" "))
out.collect(new Tuple2<>(part.toLowerCase(), 1));
}
}
class TestSource implements SourceFunction<String> {
private static final long serialVersionUID = 1L;
String s = "Hadoop is the Elephant King! A yellow and elegant thing. He never forgets. The Useful data, or lets An extraneous element cling!";
@Override
public void run(SourceContext<String> ctx) throws Exception {
ctx.collect(s);
}
@Override
public void cancel() {
}
}
运行时,输出如下:
(hadoop,1) (是,1) (the,1) (大象,1) (国王!,1) (a,1) (黄色,1) (和,1) (优雅,1) (东西。,1) (他,1) (从不,1) (忘记了,1) (the,2) (有用,1) (数据,1) (或1) (让1) (一,1) (外部1) (元素1) (坚持!,1)
我只是想知道为什么the
和(the,1)
两次出现?
我们将不胜感激。
答案 0 :(得分:1)
使用数据流时,输入是无界的,因此不可能等到“结束”打印出结果。 “最终报告”的概念毫无意义。因此,到目前为止,您得到的是不断更新的结果流。
答案 1 :(得分:0)
为什么两次出现?
我相信您已经发送了两次“ the”。并且(the,1)是您发送第一个“ the”时的计数,(the,2)是您发送第二个“ the”时的计数。
总和将在每次接收到一个元素并将其输出时汇总数据。