我们有这样的数据
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) //显示最大值
})
}