我想知道这个小片段如何工作:

如果我有这段文字:


  Ut Quis Pretium Tellus。 Fusce quis suscipit ipsum。莫比维特拉精英
  ut malesuada pellentesque。 Fusce eu ex quis urna lobortis finibus。
  整数aliquam faucibus neque id cursus。 Nulla non massa dioo。福斯
  pretium felis felis,在malesuada felis blandit nec。 Praesent ligula
  恩尼姆,格雷梅坐在amet scelerisque eget,Port mi mi。爱妮·维塔
  maximus tortor,ac facilisis orci。


以及这段代码来计算上面文本中每个单词的出现次数:

        // Load  input data.
        JavaRDD<String> input = sc.textFile(inputFile);
        // Split up into words.
        JavaRDD<String> words = input.flatMap(new FlatMapFunction<String, String>() {
            public Iterable<String> call(String x) {
                return Arrays.asList(x.split(" "));
            }
        });
        // Transform into word and count.
        JavaPairRDD<String, Integer> counts = words.mapToPair(new PairFunction<String, String, Integer>() {
            public Tuple2<String, Integer> call(String x) {
                return new Tuple2(x, 1);
            }
        }).reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer x, Integer y) {
                return x + y;
            }
        });


很容易理解这一行

JavaRDD<String> words = input.flatMap(new FlatMapFunction<String, String>() {
                public Iterable<String> call(String x) {
                    return Arrays.asList(x.split(" "));
                }
            });


创建一个数据集,其中包含按空格分割的整个单词

并且此行在每个元组中赋予值1,因此例如:

JavaPairRDD<String, Integer> counts = words.mapToPair(new PairFunction<String, String, Integer>() {
                public Tuple2<String, Integer> call(String x) {
                    return new Tuple2(x, 1);



  1
  quis,1 //继续


我对reduceByKey的工作方式以及如何计算每个单词的出现次数感到困惑?

提前致谢。

最佳答案

reduceByKey通过键(每个元组中的第一个参数)对元组进行分组,并对每个组进行归约。

像这样:

(Ut, 1), (quis, 1), ..., (quis, 1), ..., (quis, 1), ... mapToPair

               \            /             |                           reduceByKey
                      +
                 (quis, 1+1)              |
                       \                 /
                         \             /
                                +
                            (quis, 2+1)

10-04 11:22