Apache spark map-reduce解释

时间:2015-06-04 12:51:33

标签: java apache-spark

我想知道这个小片段是如何运作的:

如果我有这个文字:

  

Ut quis pretium tellus。 Fusce quis suscipit ipsum。 Morbi viverra elit   ut malesuada pellentesque。 Fusce eu ex quis urna lobortis finibus。   Integer aliquam faucibus neque id cursus。 Nulla non massa odio。 Fusce   pretium felis felis,在malesuada felis blandit nec。 Praesent ligula   enim,gravida sit amet scelerisque eget,porta non mi。 Aenean简历   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(" "));
                }
            });

创建一个包含按空格分割的全部单词的数据集

并且此行在每个元组中给出一个值,例如:

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

UT,1个
  quis,1 //继续

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

提前感谢。

2 个答案:

答案 0 :(得分:2)

reduceByKey按键(每个元组中的第一个参数)对元组进行分组,并为每个组进行减少。

像这样:

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

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

答案 1 :(得分:1)

reduceByKeyreduce非常相似。它们都采用函数并使用它来组合值。

reduceByKey运行多个并行reduce操作,一个用于数据集中的每个键,其中每个操作组合具有相同键的值。

由于数据集可能包含大量密钥,因此reduceByKey未实现为将值返回给用户程序的操作。相反,它返回一个新的RDD,由每个键和该键的减少值组成。

参考: 学习Spark - Lightning-Fast大数据分析 - 第4章 - 使用键/值对。