Java Spark RDD reduce() 实例 - 总和、最小和最大操作

526 阅读4分钟

在java编程中探索Spark RDD reduce()方法的快速指南,以从数据集中找到总和、最小和最大值。

1.概述

在本教程中,我们将学习如何使用java编程语言的Spark RDD reduce()方法。大多数开发人员 在pyspark中使用相同的 **reduce()**方法,但在本文中,我们将了解如何
用Java RDD获得sum、min和max操作

2.Java Spark RDD - reduce()方法

首先让我们了解一下java的语法 reduce() spark方法。

1

public T reduce(scala.Function2<T,T,T> f)

该方法采用Function2**功能接口,这是Java 8**的概念。但Function2是用Scala语言实现的。

2.Function2Reduce()接收两个参数作为输入并返回一个值。这里,输入和输出的类型应该是相同的。

3.Java Spark RDD reduce() 例子,用于查找总和

在下面的例子中,我们首先创建了 SparkConfJavaSparkContext为测试目的创建了本地模式。

我们已经在程序中提供了一步步的意思。

我们必须要把lambda表达式传递给reduce()方法。如果你是java的新手,请阅读关于Java 8**Lambda表达式的**深度文章。

你可能会对reduce()方法背后的逻辑感到惊讶。下面是对其内部结构的解释。作为一个开发者,你应该知道关于hood的基本知识,这是怎么回事。

在RDD上,reduce()方法被调用,其逻辑是value1 + value2。这意味着这个公式将被应用于每个分区的所有值,直到分区只有一个值为止。

如果有一个以上的分区,那么所有分区的输出将被移到另一个数据节点。接下来,再次应用相同的逻辑值1+值2来得到最终结果。

如果输入文件或数据集只有一个分区,那么它将返回单个分区的最终输出。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

package com.javaprogramto.rdd.reduce;

import java.util.Arrays;

import java.util.List;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

public class RDDReduceExample {

    public static void main(String[] args) {

        Logger.getLogger("org.apache").setLevel(Level.WARN);

        List<Integer> numbersList = getSampleData();

        SparkConf sparkConf = new SparkConf().setAppName("Java RDD_Reduce Example").setMaster("local");

        JavaSparkContext sc = new JavaSparkContext(sparkConf);

        JavaRDD<Integer> integersRDD =  sc.parallelize(numbersList);

        Integer sumResult = integersRDD.reduce( (value1, value2) -> value1 + value2);

        System.out.println("Sum of RDD numbers using reduce() : "+sumResult);

        sc.close();

    }

    /**

     * returns a list of integer numbers

     *

     * @return

     */

    private static List<Integer> getSampleData() {

        return Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

    }

}

输出。

1

Sum of RDD numbers using reduce() : 45

4.Java Spark RDD reduce() min 和 max 示例

接下来,让我们从RDD中找出最小和最大值。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

package com.javaprogramto.rdd.reduce;

import java.util.Arrays;

import java.util.List;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

public class RDDReduceExample {

    public static void main(String[] args) {

        Logger.getLogger("org.apache").setLevel(Level.WARN);

        List<Integer> numbersList = getSampleData();

        SparkConf sparkConf = new SparkConf().setAppName("Java RDD_Reduce Example").setMaster("local");

        JavaSparkContext sc = new JavaSparkContext(sparkConf);

        JavaRDD<Integer> integersRDD =  sc.parallelize(numbersList);

        Integer minResult = integersRDD.reduce( (value1, value2) -> Math.min(value1, value2));

        System.out.println("Min of RDD numbers using reduce() : "+minResult);

        Integer maxResult = integersRDD.reduce( (value1, value2) -> Math.max(value1, value2));

        System.out.println("Max of RDD numbers using reduce() : "+maxResult);

        sc.close();

    }

    /**

     * returns a list of integer numbers

     *

     * @return

     */

    private static List<Integer> getSampleData() {

        return Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

    }

}

输出。

1

2

Min of RDD numbers using reduce() : 1

Max of RDD numbers using reduce() : 9

5.结论

在这篇文章中,我们看到了如何在RDD数据集上使用reduce()聚合操作来寻找sum
、m in和max值

java
示例程序。

参考资料

Reduce() API

GitHub代码