0905-广告点击量实时统计

需求七:实时维护黑名单

7.1 需求概述

从Kafka获取实时数据,对每个用户的点击次数进行累加并写入MySQL,当一天之内一个用户对一个广告的点击次数超过100次时,将用户加入黑名单中。

7.2 简要运行流程

在这里插入图片描述

  1. 根据实时获取的数据, 批量更新用户点击次数表
  2. 更新完之后, 再从表中查出操作异常的用户
  3. 将操作异常的用户ID加入到黑名单表中

7.3 具体运行流程

在这里插入图片描述

7.4 代码实现

7.4.1 加载并转换用户数据集

        val sparkConf = new SparkConf().setAppName("adver").setMaster("local[*]")
        val sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate()

        val streamingContext: StreamingContext = new StreamingContext(sparkSession.sparkContext, Seconds(5))

        val kafka_brokers = ConfigurationManager.config.getString(Constants.KAFKA_BROKERS)
        val kafka_topics = ConfigurationManager.config.getString(Constants.KAFKA_TOPICS)

        // kafka参数配置
        val kafkaParam = Map(
            "bootstrap.servers" -> kafka_brokers,
            "key.deserializer" -> classOf[StringDeserializer],
            "value.deserializer" -> classOf[StringDeserializer],
            "group.id" -> "group1",
            "auto.offset.reset" -> "latest",
            "enable.auto.commit" -> (false: java.lang.Boolean)
            // auto.offset.reset
            // latest: 先去Zookeeper获取offset,如果有,直接使用,如果没有,从最新的数据开始消费;
            // earlist: 先去Zookeeper获取offset,如果有,直接使用,如果没有,从最开始的数据开始消费
            // none: 先去Zookeeper获取offset,如果有,直接使用,如果没有,直接报错
        )

        // 消费kafka中的数据
        // adRealTimeDStream: DStream[RDD RDD RDD ...]  RDD[message]  message: key value
        val adRealTimeDStream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream[String, String](
            streamingContext,
            LocationStrategies.PreferConsistent,
            ConsumerStrategies.Subscribe[String, String](Array(kafka_topics), kafkaParam)
        )

        // adRealTimeValueDStream: DStream[RDD RDD RDD...] RDD[String] String : timestamp province city userid adid
        val adRealTimeValueDStream: DStream[String] = adRealTimeDStream.map(item => item.value())

7.4.2 过滤掉已经上黑名单的用户

        // 从拿到的实时数据中过滤掉黑名单中的用户
        // adRealTimeFilterDStream:DStream[RDD RDD RDD...] 
        // RDD[String] 
        // String : timestamp province city userid adid
        val adRealTimeFilterDStream: DStream[String] = adRealTimeValueDStream.transform {
   
            logRDD =>
                val blackLIstArray: Array[AdBlacklist] = AdBlacklistDAO.findAll()

                val userIdArray: Array[Long] = blackLIstArray.map(item => item.userid)

                val filteredRDD: RDD[String] = logRDD.filter {
   
                    case log =>
                        val logSplit = log.split(" ")
                        val userId = logSplit(3).toLong
                        !userIdArray.contains(userId)
                }
                filteredRDD

        }

7.4.3 对实时数据进行统计,更新点击次数表

        // 对实时用户点击广告数据进行计数
        // multiKey2OneDStream: DStream[RDD,RDD...]
        // RDD : (key, value)
        // key : datekey_userId_adId
        // value : 1
        val multiKey2OneDStream: DStream
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值