import org.apache.spark.{SparkConf, SparkContext} object SparkTest { def main(args: Array[String]): Unit = { val sc=new SparkContext(new SparkConf().setMaster("local[4]").setAppName("test")); // 从文件读取数据 val rdd1 = sc.textFile("datas/agent.log") // 列裁剪+转换 val rdd2 = rdd1.map(line =>{ val data=line.split(" ")//按空格切分数据 val province=data(1)//省份 val adid=data(4)//广告 // 以(省份,广告)为key,1为value ((province,adid),1) }) //对相同key的value进行迭代累加计算 ((province,adid),1) val rdd3=rdd2.reduceByKey((agg,curr)=>agg+curr) //模式匹配,以province省份进行分组 val rdd4=rdd3.groupBy{ // num:广告点击次数 case ((province,adid),num) => province } //依赖rdd4返回的数据((province,adid),num),进行map操作 x:((province,adid),num) val rdd5=rdd4.map(x=>{ // 把每个省的广告num次数转成列表,并以num次数大小降序排序,取出每个省的前三的广告 val top3=x._2.toList.sortBy(y => y._2).reverse.take(3) // 对top3的kv((province,adid),num) => 转换成 (adid【广告】,num【广告次数】) val t3=top3.map{ case ((province,adid),num) =>(adid,num) } // 返回省份和广告,次数 ;以省份为key,【广告,广告点击次数】为value (x._1,t3) }) //job提交并遍历打印输出 rdd5.collect().foreach(println) } }