1) 数据准备 agent.log:时间戳,省份,城市,用户,广告,中间字段使用空格分隔。
2) 需求描述 统计出每一个省份每个广告被点击数量排行的 Top3
3) 需求分析
4) 功能实现
整体思路
代码实现
package com.atguigu.bigdata.spark.core.rdd.operator.transform
import org.apache.spark.{SparkConf, SparkContext}
object Spark024_RDD_Req {
def main(args: Array[String]): Unit = {
//准备环境
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
//1.获取原始数据:时间戳,省份,城市,用户,广告
val dataRDD = sc.textFile("data/agent.log")
//2. 将原始数据进行转换
//时间戳,省份,城市,用户,广告=> ((省份,广告),1)
val mapRDD = dataRDD.map(
line => {
val datas = line.split(" ")
((datas(1), datas(4)), 1)
}
)
//3.将转换后的数据分组聚合
// ((省份,广告),1)=>((省份,广告),sum)
val reduceRDD = mapRDD.reduceByKey(_ + _)
//4.将聚合的结果进行结构转换
//((省份,广告),sum)=>(省份,(广告,sum))
val newMapRDD = reduceRDD.map {
case ((province, ad), sum) => {
(province, (ad, sum))
}
}
//5.将最终结果根据省份进行分组
//(省份,[(广告A,sumA),(广告B,sumB),(广告C,sumC)])
val groupRDD = newMapRDD.groupByKey()
//6.将分组后的结果进行组内排序(降序),取前三名
val resultRDD = groupRDD.mapValues(
iter => {
iter.toList.sortBy(_._2)(Ordering.Int.reverse).take(3)
}
)
//7.采集数据
resultRDD.foreach(println)
sc.stop()
}
}