1. 需求说明
/*
* 数据文件(用户点击行为数据) :
* agent.log:时间戳,省份,城市,用户,广告,中间字段使用空格分隔
* 需求1 :
* 统计出每一个省份每个广告被点击数量排行的 Top3
* 按 省份、广告 分组,统计指标为点击次数
*
* */
2. 代码示例
object Test1 extends App {
val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("distinctTest")
val sc: SparkContext = new SparkContext(sparkconf)
private val rdd: RDD[String] = sc.textFile("Spark_319/src/data/input/agent.log")
//1.切割数据,获取省份和广告
//输出 key=省份 广告 value=1
private val rdd1: RDD[(String, Int)] = rdd.map(
e => (e.split(" ")(1) + "_" + e.split(" ")(4), 1)
)
//2. key=省份_广告 reduce
private val rdd2: RDD[(String, Int)] = rdd1.reduceByKey(_ + _)
//3. 输出 key=省份 value=广告,cnt
private val rdd3: RDD[(String, (String, Int))] = rdd2.map(
e => (e._1.split("_")(0), (e._1.split("_")(1), e._2))
)
//4. 根据 key=省份 分组 value=iter(广告,cnt)
private val rdd4: RDD[(String, Iterable[(String, Int)])] = rdd3.groupByKey
//5. 根据 value=iter(广告,cnt) 的cnt排序,并获取前3
private val rdd5 = rdd4.map(
tp => (
tp._1
, tp._2.toList.sortWith(_._2 > _._2).take(3)
)
)
rdd5.collect().foreach(println(_))
sc.stop()
}