当前位置: 首页 > news >正文

备案的网站名/百度竞价被点击软件盯上

备案的网站名,百度竞价被点击软件盯上,个人网站网址有哪些,wordpress建设大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己…

  大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/

  项目代码博主已经打包到Github需要的可以自行下载:https://github.com/459804692/spark0729

目录

  • 一. 需求分析
  • 二. 思路
  • 三. 项目实现
    • 1. bean类
    • 2. 具体实现


2

一. 需求分析

  对于排名前 10 的品类,分别获取每个品类点击次数排名前 10 的 sessionId。(注意: 这里我们只关注点击次数, 不关心下单和支付次数)
  这个就是说,对于 top10 的品类,每一个都要获取对它点击次数排名前 10 的 sessionId。
  这个功能,可以让我们看到,对某个用户群体最感兴趣的品类,各个品类最感兴趣最典型的用户的 session 的行为。

二. 思路

  1. 过滤出来 category Top10的日志
  2. 需要用到需求1的结果, 然后只需要得到categoryId就可以了
  3. 转换结果为 RDD[(categoryId, sessionId), 1] 然后统计数量 => RDD[(categoryId, sessionId), count]
  4. 统计每个品类 top10. => RDD[categoryId, (sessionId, count)] => RDD[categoryId, Iterable[(sessionId, count)]]
  5. 对每个 Iterable[(sessionId, count)]进行排序, 并取每个Iterable的前10
  6. 把数据封装到 CategorySession 中

3

三. 项目实现

1. bean类

  • 1. 创建SessionInfo
case class SessionInfo(sessionId:String,count: Long) extends Ordered[SessionInfo]{// 按照降序排列// else if (this.count == that.count) 0  这个不能加,否则会去重override def compare(that: SessionInfo): Int =if (this.count >that.count) -1else 1

2. 具体实现

  • 1. 主类实现
package com.buwenbuhuo.spark.core.project.appimport com.buwenbuhuo.spark.core.project.bean.{CategoryCountInfo, UserVisitAction}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}/****
*@author 不温卜火*** @create 2020-07-29 12:18***         MyCSDN :https://buwenbuhuo.blog.csdn.net/*/
object ProjectApp {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setAppName("ProjectAPP").setMaster("local[2]")val sc: SparkContext = new SparkContext(conf)// 把数据从文件读出来val sourceRDD: RDD[String] = sc.textFile("D:/user_visit_action.txt")// 把数据封装好(封装到样例类中)
//    sourceRDD.collect.foreach(println)val userVisitActionRDD: RDD[UserVisitAction] = sourceRDD.map(line => {val fields: Array[String] = line.split("_")UserVisitAction(fields(0),fields(1).toLong,fields(2),fields(3).toLong,fields(4),fields(5),fields(6).toLong,fields(7).toLong,fields(8),fields(9),fields(10),fields(11),fields(12).toLong)})// 需求1:val categoryTop10: List[CategoryCountInfo] = CategoryTopApp.calcCatgoryTop10(sc , userVisitActionRDD)// 需求2:top10品类的top10sessionCategorySessionTopApp.statCategorySessionTop10(sc,categoryTop10,userVisitActionRDD)// 关闭项目(sc)sc.stop()}}
  • 2. 解决方案1(原始方法,没任何优化)
package com.buwenbuhuo.spark.core.project.appimport com.buwenbuhuo.spark.core.project.bean.{CategoryCountInfo, SessionInfo, UserVisitAction}
import org.apache.spark.{Partitioner, SparkContext}
import org.apache.spark.rdd.RDDimport scala.collection.mutable/****** @author 不温卜火*         ** @create 2020-07-29 20:07***         MyCSDN :  https://buwenbuhuo.blog.csdn.net/**/
object CategorySessionTopApp {/*1. 最原始方法 ,没有任何优化,方案1*/def statCategorySessionTop10(sc: SparkContext,categoryTop10: List[CategoryCountInfo],userVisitActionRDD: RDD[UserVisitAction]): Unit ={// 1. 过滤出来只包含 top10 品类id的那些点击记录// 1.1 先把top10品类id拿出来,转成Long id的目的是为了和UserVisitAction Clided兼容val cids: List[Long] = categoryTop10.map(_.categoryId.toLong)val filteredUserVisitActionRDD: RDD[UserVisitAction] = userVisitActionRDD.filter(action => cids.contains(action.click_category_id))// 2.每个品类top10session的计算// 2.1 先map出来需要字段val cidSidAndOne: RDD[((Long, String), Int)] =filteredUserVisitActionRDD.map(action =>((action.click_category_id,action.session_id),1))// 2.2 做聚合操作   得到RDD[((cid,sid),count)]val cidSidAndCount: RDD[((Long, String), Int)] = cidSidAndOne.reduceByKey(_ + _)// map 出来想要的数据结构val cidAndSidCount: RDD[(Long, (String, Int))] = cidSidAndCount.map {case ((cid, sid), count) => (cid, (sid, count))}// 2.3 分组  排序取Top10val cidAandSidCountItRDD: RDD[(Long, Iterable[(String, Int)])] = cidAndSidCount.groupByKey()// 2.4 对每个值排序取top10//  解法1: 最原始的写法 最不好的写法,it.toList一时爽,不过最终可能会因为内存原因而爆掉val result = cidAandSidCountItRDD mapValues((it:Iterable[(String,Int)]) =>{// 只能使用scala排序,scala排序必须把所有数据全部加载到内存才能排。// 如果数据量很小可以 ,数据量大就不行了it.toList.sortBy(-_._2).take(10)})result.collect.foreach(println)}}/*
计算热门session口径:看每个session的点击记录1. 过滤出来只包含 top10 品类id的那些点击记录2. 每个品类top10session的计算=> RDD[(品类id, sessionId))] map=> RDD[(品类id, sessionId), 1)]  reduceByKey=> RDD[(品类id, sessionId), count)]    map=> RDD[品类id, (sessionId, count)]     groupByKeyRDD[品类id, Iterator[(sessionId, count)]]  map内部,对iterator排序,取前10----*/

4

  • 3. 解决方案2
/*2. 解决方案2:每次排序一个cid,需要排10次*/def statCategorySessionTop10_2(sc: SparkContext,categoryTop10: List[CategoryCountInfo],userVisitActionRDD: RDD[UserVisitAction]): Unit ={// 1. 过滤出来只包含 top10 品类id的那些点击记录// 1.1 先把top10品类id拿出来,转成Long id的目的是为了和UserVisitAction Clided兼容val cids: List[Long] = categoryTop10.map(_.categoryId.toLong)val filteredUserVisitActionRDD: RDD[UserVisitAction] = userVisitActionRDD.filter(action => cids.contains(action.click_category_id))// 方案2写法1:/*// 2. 需要排10次cids.foreach(cid =>{// 2.1 先过滤出来点击id是cid的那些记录val cidUserVisitActionRDD: RDD[UserVisitAction] = filteredUserVisitActionRDD.filter(_.click_category_id == cid)// 2.2 聚合val result: Map[Long, List[(String, Int)]] = cidUserVisitActionRDD.map(action => ((action.click_category_id, action.session_id), 1)).reduceByKey(_ + _).map {case ((cid, sid), count) => (cid, (sid, count))}.sortBy(- _._2._2).take(10).groupBy(_ . _1).map{case (cid,arr) => (cid,arr.map(_._2).toList)}println(result.toMap)})*/// 方案2写法2:// 2. 需要排10次val temp: List[Map[Long, List[(String, Int)]]] = cids.map(f = cid => {// 2.1 先过滤出来点击id是cid的那些记录val cidUserVisitActionRDD: RDD[UserVisitAction] = filteredUserVisitActionRDD.filter(_.click_category_id == cid)// 2.2 聚合val r: Map[Long, List[(String, Int)]] = cidUserVisitActionRDD.map(action => ((action.click_category_id, action.session_id), 1)).reduceByKey(_ + _).map {case ((cid, sid), count) => (cid, (sid, count))}.sortBy(-_._2._2).take(10).groupBy(_._1).map {case (cid, arr) => (cid, arr.map(_._2).toList)}r})val result: List[(Long, List[(String, Int)])] = temp.flatMap(map => map)result.foreach(println)}/*使用scala的排序,会导致内存溢出
问题解决方案:方案2:1. 使用spark排序,来解决问题2. spark的排序是整体排序。 不能直接使用spark排序3. 10个品类id,我就使用spark的排序功能排10次优点:一定能完成,不会oom缺点:要起10个Job,排序10次*/

5

  • 4. 解决方案3
     /*3. 解决方案3:找一个可以排序的集合,然后时刻保持这个集合中只有10最大的元素*/def statCategorySessionTop10_3(sc: SparkContext,categoryTop10: List[CategoryCountInfo],userVisitActionRDD: RDD[UserVisitAction]): Unit ={// 1. 过滤出来只包含 top10 品类id的那些点击记录// 1.1 先把top10品类id拿出来,转成Long id的目的是为了和UserVisitAction Clided兼容val cids: List[Long] = categoryTop10.map(_.categoryId.toLong)val filteredUserVisitActionRDD: RDD[UserVisitAction] = userVisitActionRDD.filter(action => cids.contains(action.click_category_id))// 2.每个品类top10session的计算// 2.1 先map出来需要字段val cidSidAndOne: RDD[((Long, String), Int)] =filteredUserVisitActionRDD.map(action =>((action.click_category_id,action.session_id),1))// 2.2 做聚合操作   得到RDD[((cid,sid),count)]val cidSidAndCount: RDD[((Long, String), Int)] = cidSidAndOne.reduceByKey(_ + _)// map 出来想要的数据结构val cidAndSidCount: RDD[(Long, (String, Int))] = cidSidAndCount.map {case ((cid, sid), count) => (cid, (sid, count))}// 2.3 分组  排序取Top10val cidAandSidCountItRDD: RDD[(Long, Iterable[(String, Int)])] = cidAndSidCount.groupByKey()// 2.4 对每个值排序取top10val result = cidAandSidCountItRDD mapValues((it:Iterable[(String,Int)]) =>{// 不要把Iterable直接转成list再排序var set = mutable.TreeSet[SessionInfo]()it.foreach{case (sid,count) =>val info: SessionInfo = SessionInfo(sid, count)set += infoif(set.size > 10) set = set.take(10)}set.toList})// 起1 jobresult.collect.foreach(println)Thread.sleep(1000000)}/*方案3:内存溢出,iterable => 转换list最终的目的top10搞一个集合,这集合中永远只保存10个元素,用于最大的10个元素先聚合,聚合后分组,分组内做了排序(用了自动排序的功能集合TreeSet)优点:一定可以完成,也不会oom,job也是只有一个job坏处:做了两次shuffle,效率比较低下*/

6

  • 5. 解决方案4
    /*4. 解决方案4:去掉groupBy,减少shuffle的次数*/def statCategorySessionTop10_4(sc: SparkContext,categoryTop10: List[CategoryCountInfo],userVisitActionRDD: RDD[UserVisitAction]): Unit ={// 1. 过滤出来只包含 top10 品类id的那些点击记录// 1.1 先把top10品类id拿出来,转成Long id的目的是为了和UserVisitAction Clided兼容val cids: List[Long] = categoryTop10.map(_.categoryId.toLong)val filteredUserVisitActionRDD: RDD[UserVisitAction] = userVisitActionRDD.filter(action => cids.contains(action.click_category_id))// 2.每个品类top10session的计算// 2.1 先map出来需要字段val cidSidAndOne: RDD[((Long, String), Int)] =filteredUserVisitActionRDD.map(action =>((action.click_category_id,action.session_id),1))// 2.2 做聚合操作   得到RDD[((cid,sid),count)]val cidSidAndCount: RDD[((Long, String), Int)] =cidSidAndOne.reduceByKey(new CategorySessionPartitioner(cids),_ + _)// 2.3 cidSidAndCount 执行mapPartitionsval result: RDD[(Long, List[SessionInfo])] = cidSidAndCount.mapPartitions(it => {// 不要把Iterable直接转成list再排序var set = mutable.TreeSet[SessionInfo]()var  categoryId = -1Lit.foreach {case ((cid, sid), count) =>categoryId = cidval info: SessionInfo = SessionInfo(sid, count)set += infoif (set.size > 10) set = set.take(10)}
//          set.map((categoryId, _)).toIteratorIterator((categoryId, set.toList))})result.collect.foreach(println)Thread.sleep(1000000)}
}class CategorySessionPartitioner(cids:List[Long]) extends Partitioner {private val cidIndexMap: Map[Long, Int] = cids.zipWithIndex.toMap// 分区和品类id数量保持一致,可以保证一个的分区只有一个cidoverride def numPartitions: Int = 10// (Long,String) => (cid,sessionId)override def getPartition(key: Any): Int = key match {// 使用这个cid在数组中的下标作为分区的索引非常合适case (cid:Long,_) => cidIndexMap(cid)}}/*方案4:对方案3做优化,减少一次shuffle减少shuffle只能是去掉groupByKey还得需要得到每一个cid的所有session的集合?! 怎样得到?rdd是分区的,mapPartitions(it => {})能不能让一个分区只有一个cid的所有数据每个分区只有一种cid,如何做到每个分区只有一个cid?用自定义区分器!10cid,应该有10个分区*/

7
综合上述四种方法 最后一种方法是最完美的

  本次的分享就到这里了,


14

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

15
16

http://www.jmfq.cn/news/5294881.html

相关文章:

  • 广州做网站公司哪家好/百度域名查询
  • 网站建设佰首选金手指十二/品牌营销策略
  • 药品网站如何建设/网站网页设计
  • 惠州建设银行网站/淘宝运营培训班
  • 怎么做国外的网站吗/购买链接怎么买
  • 微信服务号菜单链接网站怎么做/网站排名费用
  • 做网站遇上麻烦客/百度建站云南服务中心
  • 自考在线做试卷的网站/百度手机端排名如何优化
  • 中国人民银行网站官网/怎样联系百度客服
  • 学做网站论坛vip号码/什么是搜索引擎营销?
  • 网页设计模板网/seo案例分析及解析
  • 江门外贸网站建设/网络运营与推广
  • 网站建设 起飞/seo优化收费
  • 网站建设福建/宁波seo公司
  • 雄安移动网站建设/四川旅游seo整站优化站优化
  • 网站开发编程环境/大数据营销软件
  • 想开个网站怎样开公司/网络推广技巧
  • 哈尔滨网站建设/含有友情链接的网页
  • 腾讯风铃wordpress/克州seo整站排名
  • 湖北省税务局网站建设方/快速建站教程
  • 余姚做企业网站/网络软文范例
  • 一个公网ip可以做几个网站/友情链接可以帮助店铺提高浏览量
  • 人大网站建设汇报/宁波seo外包服务商
  • 建网站需要了解哪些网站建设知识/免费制作网页平台
  • 涞源县住房和城乡建设局网站/怎么找需要做推广的公司
  • 做排名的网站哪个好/汕头网站推广
  • 网站维护和网页维护区别/建站网站关键词优化
  • 做外墙资料的网站/苏州整站优化
  • 温州如何进行网站推广/学电子商务出来能干嘛
  • 网站开发未来发展趋势/网站推广系统