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
1516609143869 0 8 8 15
1516609143869 0 6 91 17
1516609143869 0 1 18 24
1516609143869 1 4 44 15
1516609143869 1 3 54 13
1516609143869 1 3 30 3
1516609143871 9 6 65 11
1516609143871 0 9 9 19
1516609143871 4 0 32 20
1516609143871 2 1 28 26
1516609143871 5 2 68 24
1516609143871 8 6 58 3
1516609143871 6 7 95 14
1516609143871 7 2 33 27
1516609143871 4 1 16 13
1516609143871 2 2 68 28
1516609143871 5 0 71 19
1516609143871 8 5 66 7
1516609143871 4 4 31 0
1516609143871 9 9 79 18
1516609143871 9 0 69 10
1516609143871 9 6 92 4
1516609143871 8 1 41 4
1516609144913 1 3 87 28
1516609144913 8 0 2 5
1516609144913 5 9 46 23
1516609144913 4 0 7 24
1516609144913 9 5 99 11
1516609144913 7 1 36 16
1516609144913 2 3 96 13
1516609144913 3 1 31 10
1516609144913 0 9 20 27
1516609144913 2 9 41 19
1516609144913 3 3 21 19
1516609144913 3 2 19 28
1516609144913 6 3 61 9
1516609144913 8 1 83 27
1516609144913 9 0 26 20
1516609144913 2 1 38 11
1516609144913 5 6 52 7
1516609144913 6 6 80 19
1516609144913 4 9 83 6
1516609144913 9 1 13 0
1516609144913 4 6 36 26
1516609144913 5 4 20 17
1516609144913 6 9 6 4
1516609144913 7 4 88 22
1516609144913 6 6 99 22
1516609144913 2 9 9 4
1516609144913 6 6 62 8
1516609144913 2 1 62 5
1516609144913 4 3 4 23
1516609144913 7 2 90 26
1516609144913 3 4 17 9
1516609144913 2 5 64 14
1516609144913 1 5 57 3
1516609144913 3 9 36 14
1516609144913 4 3 49 9
1516609144913 5 7 37 15
1516609144913 9 2 28 1
1516609144913 6 3 74 3
1516609144913 9 9 93 27
1516609144913 6 7 67 22
1516609144913 5 0 53 24
1516609144913 9 1 68 27
1516609144913 0 0 99 5
1516609144913 0 6 22 15
1516609144913 7 3 54 6
1516609144913 2 8 47 26
1516609144913 3 1 19 2
1516609144913 2 6 12 21
1516609144913 0 4 65 27
2、需求介绍
统计出每一个省份每个广告被点击数量排行的 Top3
3、编写代码
package spark.core.demoimport org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD/*** 需求:统计出每一个省份每个广告被点击数量排行的 Top3*/
object Demo {def main(args: Array[String]): Unit = {val sparkConf = new SparkConf().setMaster("local[*]").set("spark.driver.host", "localhost").setAppName("rdd")val sc = new SparkContext(sparkConf)// 1、创建 RDD// 数据格式:时间戳、省份、城市、用户、广告,以空格隔开val rdd1: RDD[String] = sc.textFile("input/agent.log")// 2、转换数据类型// 数据格式:(省份-广告,1)val rdd2: RDD[(String, Int)] = rdd1.map(line => {(line.split(" ")(1) + "_" + line.split(" ")(4), 1)})// 3、对数据进行聚合// 数据格式:(省份-广告,sum值)val rdd3: RDD[(String, Int)] = rdd2.reduceByKey(_ + _)// 4、对数据进行格式转换// 数据格式:(省份,(广告,sum值))val rdd4: RDD[(String, (String, Int))] = rdd3.map(data => {(data._1.split("_")(0), (data._1.split("_")(1), data._2))})// 5、对省份再进行聚合// 数据格式:(省份,((广告,sum值)、(广告,sum值)...))val rdd5: RDD[(String, Iterable[(String, Int)])] = rdd4.groupByKey()// 6、选择 top3val result: RDD[(String, List[(String, Int)])] = rdd5.mapValues(iter => {iter.toList.sortWith((left, right) => {left._2 > right._2}).take(3)})result.foreach(println)sc.stop()}
}
运行结果: