spark练习之统计广告Top3

原始数据,
数据按顺序为timestamp,province,city,userid,adid

1562085629599	Hebei	Shijiazhuang	564	1
1562085629621	Hunan	Changsha	14	6
1562085629636	Hebei	Zhangjiakou	265	9
1562085629653	Hunan	Changsha	985	4
1562085629677	Jiangsu	Nanjing	560	6
1562085629683	Hubei	Jingzhou	274	2
1562085629699	Jiangsu	Suzhou	29	5
1562085629704	Jiangsu	Nanjing	759	3
1562085629706	Hunan	Xiangtan	88	8
1562085629713	Hebei	Zhangjiakou	102	9
1562085629715	Hebei	Zhangjiakou	302	2

需求
统计每一个省份点击TOP3的广告ID
参考答案

(Hunan,List((5,2273), (1,2202), (2,2193)))
(Hebei,List((7,2250), (8,2240), (3,2234)))

解析

  • 需求每个省点击top3,需要依据省份,以及广告Id分组
  • 需要对每个省每个广告点击量求和
  • 本题需要用到的数据有province,adid 其余都用不上
  • top3 则需要对广告点击数排序.则需要把广告id和每个广告的点击数构造到同一个数组中, id和点击数绑定到一块,(元组形式)
def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("count").setMaster("local")
    val sc = new SparkContext(conf)
    val file: RDD[String] = sc.textFile("D:\\mypc\\Phase03-02-Spark\\day04\\作业\\数据")
    val arr = file.map(line => {
      val lineArr = line.split("\t")
      val province = lineArr(1)
      val ad_id = lineArr(4)
      ((province, ad_id), 1)
    })
    // per(广告+id) 点击量
    val sumed: RDD[((String, String), Int)] = arr.reduceByKey((x, y) => (x + y))
    //每个省top3广告点击量  依据省分组,重组上述数据
    val resumed: RDD[(String, (String, Int))] = sumed.map(line => {
      val province = line._1._1
      val adid = line._1._2
      val proAdsum = line._2
      (province, (adid, proAdsum))
    })
    //依据省聚合
    val resumby_pro: RDD[(String, Iterable[(String, Int)])] = resumed.groupByKey()
    //排序
    val sorted = resumby_pro.mapValues(_.toList.sortWith((x, y) => (x._2 > y._2)).take(3))
    val map: collection.Map[String, List[(String, Int)]] = sorted.collectAsMap()
    println(map)
  }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个需求,需要以下步骤: 1. 从数据源获取景点搜索数据,例如从Kafka、Flume等消息队列或者数据流中获取。 2. 使用SparkStreaming进行实时处理,将数据流转换为DStream流。 3. 对DStream进行处理,统计每个景点的搜索次数,可以使用reduceByKey算子进行聚合操作。 4. 对聚合结果进行排序,取出搜索次数最多的前三个景点。 5. 将结果输出到外部存储系统,如HDFS、MySQL、Redis等。 下面是一个简单的代码示例: ```scala import org.apache.spark._ import org.apache.spark.streaming._ import org.apache.spark.streaming.StreamingContext._ import org.apache.spark.streaming.kafka._ val conf = new SparkConf().setAppName("SearchHotTop3") val ssc = new StreamingContext(conf, Seconds(5)) val topics = Set("search_topic") val kafkaParams = Map("metadata.broker.list" -> "localhost:9092") val searchStream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder]( ssc, kafkaParams, topics) val searchCount = searchStream.map(x => (x._2.split(",")(0), 1)) .reduceByKey(_ + _) .map(x => (x._2, x._1)) .transform(_.sortByKey(false)) searchCount.foreachRDD(rdd => { val top3 = rdd.take(3) // 输出到外部存储系统,如HDFS、MySQL、Redis等 }) ssc.start() ssc.awaitTermination() ``` 在这个示例中,我们使用Kafka作为数据源,在5秒的时间窗口内统计每个景点的搜索次数,然后按照搜索次数从高到低进行排序,取出搜索次数最多的前三个景点,并将结果输出到外部存储系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值