1、数据准备
数据结构:时间戳,省份,城市,用户,广告,中间字段使用空格分隔。
数据样式如下:
1516609143867 6 7 64 16
1516609143869 9 4 75 18
1516609143869 1 7 87 12
1516609143869 2 8 92 9
1516609143869 6 7 84 24
1516609143869 1 8 95 5
1516609143869 8 1 90 29
1516609143869 3 3 36 16
1516609143869 3 3 54 22
1516609143869 7 6 33 5
1516609143869 8 2 91 27
1516609143869 0 5 66 5
1516609143869 1 3 33 6
1516609143869 6 2 97 21
1516609143869 5 2 95 24
1516609143869 8 9 73 11
1516609143869 4 8 62 15
1516609143869 5 5 40 23
1516609143869 6 6 53 17
1516609143869 3 0 86 21
1516609143869 4 6 1 11
1516609143869 3 6 49 7
1516609143869 8 3 4 18
1516609143869 8 8 69 14
1516609143869 0 6 51 29
1516609143869 5 3 59 2
1516609143869 8 4 66 25
1516609143869 3 4 63 9
2、需求
统计出每一个省份广告被点击次数的 TOP3
3、代码实现
import org.apache.spark.rdd.RDD
import org.apache.spark.{
SparkConf, SparkContext}
//需求:统计出每一个省份广告被点击次数的 TOP3
object Practice {
def main(args: Array[String]): Unit = {
//1.初始化 spark 配置信息并建立与 spark 的连接
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Test")
val sc = new SparkContext(sparkConf)
//2.读取数据生成 RDD:TS,Province,City,User,AD
val line = sc.textFile("E:\\IDEAWorkSpace\\SparkTest\\src\\main\\resources\\agent.log")
//3.按照最小粒度聚合:((Province,AD),1)
val provinceAdAndOne = line.map {
x =>
val fields: Array[String] = x.split(" ")
((fields(1), fields(3)), 1)
}
//4.计算每个省中每个广告被点击的总数:((Province,AD),sum)
val provinceAdToSum = provinceAdAndOne.reduceByKey(_ + _)
//5.将省份作为 key,广告加点击数为 value:(Province,(AD,sum))
val provinceToAdSum = provinceAdToSum.map(x => (x._1._1, (x._1._2, x._2)))
//6.将同一个省份的所有广告进行聚合(Province,List((AD1,sum1),(AD2,sum2)...))
val provinceGroup = provinceToAdSum.groupByKey()
//7.对同一个省份所有广告的集合进行排序并取前 3 条,排序规则为广告点击总数
val provinceAdTop3 = provinceGroup.mapValues {
x =>
x.toList.sortWith((x, y) => x._2 > y._2).take(3)
}
//8.将数据拉取到 Driver 端并打印
provinceAdTop3.collect().foreach(println)
//9.关闭与 spark 的连接
sc.stop()
}
}
运行结果: