【spark】示例:求极值

我们有这样的数据

1.建立SparkContext读取数据

  (1)建立sc

  (2)通过sc.textFile()读取数据创建Rdd

2.过滤数据

 通过filter(line => line.trim.length>0)过滤掉无效数据

3.转换数据类型以及转换成键值对的形式

我们要把String类型的数据换成Int类型的,并且要转化成为("key",Int)类型的键值对

每条数据都有相同的Key,然后我们通过groupByKey()方法将所有的值收集到一个集合中。

有同学会问?我们用求Top的思想去求不也行吗?

当然是可以的,但是我们每次只能求一个值,不能同时求出最大值和最小值。

4.调用groupByKey()方法把所有数据收集到同一个集合中

5.遍历集合求最大值最小值

我们追个比较每个数据,要是比最大值大就替换,比最小值小替换。

遍历结束后,最大值最小值就得出来了。

val max = Integer.MAX_VALUE

val min = Integer.MIN_VALUE

for(num <- x._2){

  if(num > max)

    max = num

  if(num < min)

    min = num

}

完整代码

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

object MaxAndMin {
    //建立SparkContext
    val sparkConf = new SparkConf().setAppName("TopN")
    val sc = new SparkContext(sparkConf)
    //设置日志等级,只显示报错
    sc.setLogLevel("ERROR")
    //读取数据,分区
    val lines = sc.textFile("hdfs://localhost:9000/user/local/spark/data",2)
    var min = Integer.MAX_VALUE
    var max = Integer.MIN_VALUE
    var result = lines.filter(line => line.trim.length > 0 )//过滤数据
                      .map(x =>("key",x.toInt)) //修改数据类型并转化为键值对的形式
                      .groupByKey()//分组,因为每条数据都设置的相同的key,所以最终所有数据会分到一个集合中
                      .map( x => {  //求最大值,最小值
                          for(num <- x._2){
                              if(num > max)
                                  max = num
                              if(num < min)
                                  min = num
                          }
                          (max,min)//返回值
                      })
                      .collect
                      .foreach( x =>{ //显示数据,
                                      //注意之前匿名函数x=>(max,min),所以这里操作的是数据是(max,min)
                            println("max"+"\t"+x._1) //显示最大值
                            println("min"+"\t"+x._2) //显示最大值
    })
}

  

猜你喜欢

转载自www.cnblogs.com/zzhangyuhang/p/9035319.html