[Spark Core] Spark 实现气温统计


0. 说明

  聚合气温数据,聚合出 MAX 、 MIN 、 AVG


1. Spark Shell 实现

  1.1 MAX

  分步实现

# 加载文档
val rdd1 = sc.textFile("file:///home/centos/temp3.dat")

# 压扁
val rdd2 = rdd1.map(line=>{var arr = line.split(" ");(arr(0).toInt , arr(1).toInt)})

# 得到最大值
val rdd3 = rdd2.reduceByKey((a,b)=>if(a > b)a else b)

rdd3.collect

# 年份升序
val rdd4 = rdd3.sortByKey(true)

# 气温降序
val rdd4 = rdd3.sortBy(t=>t._2,false)
rdd4.collect 

# 遍历输出
rdd4.
foreach(println)

  一步完成

sc.textFile("file:///home/centos/temp3.dat").map(line=>{var arr = line.split(" ");(arr(0).toInt , arr(1).toInt)}).reduceByKey((a,b)=>if(a > b)a else b).sortByKey(true).collect.foreach(println)

  1.2 MIN

  分步实现

# 加载文档
val rdd1 = sc.textFile("file:///home/centos/temp3.dat")

# 压扁
val rdd2 = rdd1.map(line=>{var arr = line.split(" ");(arr(0).toInt , arr(1).toInt)})

# 得到最小值
val rdd3 = rdd2.reduceByKey((a,b)=>if(a < b)a else b)

rdd3.collect

# 年份升序
val rdd4 = rdd3.sortByKey(true)

# 气温降序
val rdd4 = rdd3.sortBy(t=>t._2,false)
rdd4.collect # 遍历输出 rdd4.
foreach(println)

  一步完成

sc.textFile("file:///home/centos/temp3.dat").map(line=>{var arr = line.split(" ");(arr(0).toInt , arr(1).toInt)}).reduceByKey((a,b)=>if(a < b)a else b).sortByKey(true).collect.foreach(println)

 


2. IDEA 实现

  2.1 Scala 实现一

import org.apache.spark.{SparkConf, SparkContext}

/**
  * 气温数据聚合应用
  */
object TempAggDemoScala {
  def main(args: Array[String]): Unit = {
    // 创建 spark 配置对象
    val conf = new SparkConf()
    conf.setAppName("tempAgg2")
    conf.setMaster("local")

    // 创建上下文
    val sc = new SparkContext(conf)

    // 1. 加载文件
    val rdd1 = sc.textFile("file:///e:/temp3.dat")

    // 2. 切割成对(1930,54)
    val rdd2 = rdd1.map(line => {
      var arr = line.split(" ")
      (arr(0).toInt, arr(1).toInt)
    })

    // 3. 按照年度分组(1930->{23,34,67} , 1931->{...})
    val rdd3 = rdd2.groupByKey()

    // 4. 对组内元素进行统计聚合
    val rdd4 = rdd3.mapValues(it => {
      val max = it.max
      val min = it.min
      val sum = it.sum
      val size = it.size
      (max, min, sum.toFloat / size)

    })

    // 5. 按照年度排序
    val rdd5 = rdd4.sortByKey(true)

    // 6. 输出
    rdd5.collect().foreach(println)
  }
}

  2.2 Scala 实现二

import org.apache.spark.{SparkConf, SparkContext}

/**
  * 气温数据聚合应用2
  */
object TempAggDemo2Scala {
  def main(args: Array[String]): Unit = {
    // 创建 spark 配置对象
    val conf = new SparkConf()
    conf.setAppName("tempAgg2")
    conf.setMaster("local")

    // 创建上下文
    val sc = new SparkContext(conf)

    // 1. 加载文件
    var rdd1 = sc.textFile("file:///e:/temp3.dat")

    // 2. 切割成对(1930,(54,54,54,1))
    val rdd2 = rdd1.map(line => {
      var arr = line.split(" ")
      // (max , min , sum , count)
      val year = arr(0).toInt
      val temp = arr(1).toInt
      (year, (temp, temp, temp, 1))
    })

    // 3. 聚合
    val rdd3 = rdd2.reduceByKey((a, b) => {
      import scala.math._
      (max(a._1, b._1), min(a._2, b._2), a._3 + b._3, a._4 + b._4)
    })

    // 4. 交换
    val rdd4 = rdd3.mapValues(t => {
      (t._1, t._2, t._3.toFloat / t._4)
    }).sortByKey()

    rdd4.collect().foreach(println)
  }
}

  2.3 Java 实现二

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import scala.Tuple3;
import scala.Tuple4;

import java.util.List;


/**
 * 气温数据聚合应用2
 */
public class TempAggDemoJava2 {
    public static void main(String[] args) {
        // 创建 spark 配置对象
        SparkConf conf = new SparkConf();
        conf.setAppName("tempAgg2");
        conf.setMaster("local");

        // 创建上下文
        JavaSparkContext sc = new JavaSparkContext(conf);

        // 1. 加载文件
        JavaRDD<String> rdd1 = sc.textFile("file:///e:/temp3.dat");

        // 2. 变换(1903,(32,23,23,1))
        JavaPairRDD<Integer, Tuple4<Integer, Integer, Integer, Integer>> rdd2 = rdd1.mapToPair(new PairFunction<String, Integer, Tuple4<Integer, Integer, Integer, Integer>>() {
            public Tuple2<Integer, Tuple4<Integer, Integer, Integer, Integer>> call(String s) throws Exception {
                String[] arr = s.split(" ");
                int year = Integer.parseInt(arr[0]);
                int temp = Integer.parseInt(arr[1]);

                Tuple4<Integer, Integer, Integer, Integer> v = new Tuple4<Integer, Integer, Integer, Integer>(temp, temp, temp, 1);
                return new Tuple2<Integer, Tuple4<Integer, Integer, Integer, Integer>>(year, v);
            }
        });

        // 3. 聚合
        JavaPairRDD<Integer, Tuple4<Integer, Integer, Integer, Integer>> rdd3 = rdd2.reduceByKey(
                new Function2<Tuple4<Integer, Integer, Integer, Integer>, Tuple4<Integer, Integer, Integer, Integer>, Tuple4<Integer, Integer, Integer, Integer>>() {
                    public Tuple4<Integer, Integer, Integer, Integer> call(Tuple4<Integer, Integer, Integer, Integer> v1, Tuple4<Integer, Integer, Integer, Integer> v2) throws Exception {
                        int max = Math.max(v1._1(), v2._1());
                        int min = Math.min(v1._2(), v2._2());
                        int sum = v1._3() + v2._3();
                        int count = v1._4() + v2._4();

                        return new Tuple4<Integer, Integer, Integer, Integer>(max, min, sum, count);
                    }
                });

        //4. map取出avg
        JavaPairRDD<Integer, Tuple3<Integer, Integer, Float>> rdd4 = rdd3.mapValues(new Function<Tuple4<Integer, Integer, Integer, Integer>, Tuple3<Integer, Integer, Float>>() {
            public Tuple3<Integer, Integer, Float> call(Tuple4<Integer, Integer, Integer, Integer> v1) throws Exception {
                return new Tuple3<Integer, Integer, Float>(v1._1(), v1._2(), (float) v1._3() / v1._4());
            }
        });

        // 5. 排序
        JavaPairRDD<Integer, Tuple3<Integer, Integer, Float>> rdd5 = rdd4.sortByKey();

        // 6. 列表
        List<Tuple2<Integer, Tuple3<Integer, Integer, Float>>> list = rdd5.collect();

        for (Tuple2<Integer, Tuple3<Integer, Integer, Float>> t : list) {
            System.out.println(t);
        }

    }
}

且将新火试新茶,诗酒趁年华。
原文地址:https://www.cnblogs.com/share23/p/9757095.html