【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) //显示最大值 }) }