Дубликаты ключей присутствуют в выводе - PullRequest
0 голосов
/ 01 февраля 2019

Я пробую Apache Flink, и чтобы проверить свои знания в процессе обучения, я играю с классической проблемой Word Count.

Вот мой код:

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) (о, 2) (полезно, 1) (данные ,, 1)(или 1) (пусть, 1) (an, 1) (посторонний, 1) (элемент, 1) (цепляться!, 1)

Мне просто любопытно узнать, почему the приходитв два раза, как (the,1) и (the,2)?

Помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

При работе с потоками данных ввод не ограничен, поэтому невозможно дождаться «конца», чтобы распечатать результаты.Понятие «итоговый отчет» не имеет смысла.Так что вместо этого вы получаете постоянно обновляемый поток результатов.

0 голосов
/ 01 февраля 2019

Почему приходит дважды?

Я полагаю, что вы отправили "the" дважды.И ((, 1) - это число, когда вы отправили первое «the», ((,, 2) - это количество, когда вы отправили второе «the».

Сумма будет собирать данные каждыераз он получает элемент и выводит его.

...