Я пробую 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)
?
Помощь будет высоко ценится.