第五章_Spark核心编程_Rdd_转换算子_keyValue型_(需求)统计出每一个省份每个广告被点击数量排行的 Top3

 


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()
  }
复制代码

 

posted @   学而不思则罔!  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示