输出中存在重复的键

时间:2019-01-31 23:23:22

标签: apache-flink flink-streaming

我正在尝试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)两次出现?

我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用数据流时,输入是无界的,因此不可能等到“结束”打印出结果。 “最终报告”的概念毫无意义。因此,到目前为止,您得到的是不断更新的结果流。

答案 1 :(得分:0)

  

为什么两次出现?

我相信您已经发送了两次“ the”。并且(the,1)是您发送第一个“ the”时的计数,(the,2)是您发送第二个“ the”时的计数。

总和将在每次接收到一个元素并将其输出时汇总数据。