用户画像项目笔记2

DSP业务背景
当今时代,广告业务已经进入到RTB程序化实时竞价时代,公司扩展了一块DMP的业务
DSP(Demand-Side Platform):广告需求方平台!代各种广告主,去ADX(advertising Exchange  ADX 广告实时竞价交易平台 )参与程序化竞价!
DMP:数据管理平台;为DSP提供用户画像数据服务!

在这里插入图片描述

数据分类
1 DSP需求平台(本公司)行为日志 业务数据
2 ADX广告竞价平台数据
3 第三方合作数据比如运营商数据
图计算
背景: 要从这些纷繁复杂的各类id中,分辨出哪些id属于同一个受众(设备),
用普通的“where x=y”这种简单条件逻辑很难实现。而图计算,能很好地解决此类问题(连通子图)
基本概念: 图,顶点和边的数据模型  顶点, id和属性组成的对象 有向 无向 有环 无环 度, 出边和入边的量 超步, 图的计算每一轮的迭代 
实现: 一行数据相关点放在对象(图)中, 相关边(可以串联也可并发连)也放在对象(图)中,
相同边数量的阈值调整区分不同用户 20万 => 100万
根据图生成最大连通子图(顶点id, 一类顶点中id最小值)
T日的最大连通子图 组成顶点和边 和 T+ 1日的顶点和边汇总  绘制图获取新的最大连通子图
然后根据T日和T+1日gid分组结果 求id的交集 调整gid
	val cmccLogPath = "user_profile/data/cmcclog/day01"
    val dspLogPath = "user_profile/data/dsplog/day01"
    val eventLogPath = "user_profile/data/eventlog/day01"

    val cmccrdd = IdsExtractor.extractCmccLogIds(spark,cmccLogPath)
    val dsprdd = IdsExtractor.extractDspLogIds(spark,dspLogPath)
    val eventrdd = IdsExtractor.extractEventLogIds(spark,eventLogPath)
    val ids = cmccrdd.union(dsprdd).union(eventrdd)
    //获取顶点
    val vertices = ids.flatMap(arr => {
      for (elem <- arr) yield (elem.hashCode.toLong, elem)
    })
    //组合边 为了过滤 组合每个顶点都连接的边 不影响构建图
    val edges = ids.flatMap(arr => {
      val sortedArr = arr.sorted
      for (i <- 0 until sortedArr.length; j <- i + 1 until sortedArr.length) yield
        Edge(sortedArr(i).hashCode.toLong, sortedArr(j).hashCode.toLong, "")
    })

    val edgesres = edges.map(e=>(e,1)).reduceByKey(_+_).filter(t=>t._2 > 2).map(_._1)
    
    //获取T数据的idmp
    
    val idmpTdf = spark.read.parquet("user_profile/demodata/idmp/output/day01")
    val tvertices = idmpTdf.rdd.flatMap{
      case Row(id:Long, gid:Long) => Array((id,""), (gid,""))
    }
    val tedges = idmpTdf.rdd.map {
      case Row(id:Long, gid:Long) => Edge(id, gid, "")
    }

    val graph = Graph(vertices.union(tvertices), edgesres.union(tedges))
    val childrenGraph = graph.connectedComponents()
    //获取t+1 和t 的顶点对应的最小值
    val t1Vertices: VertexRDD[VertexId] = childrenGraph.vertices
	val idmp = idmpTdf.rdd.map{
      case Row(id:Long, gid:Long) => (id, gid)
    }.collectAsMap()
    val idmpbc = spark.sparkContext.broadcast(idmp)
    // 利用上日idmap调整当日计算结果
    val result = t1Vertices.groupBy(_._2).flatMap(t => {
      val nset = t._2.toMap.keySet
      val idmpdict = idmpbc.value
      val oset = idmpdict.keySet
      val intersectSet = nset.intersect(oset)
      var gid = t._1
      if (intersectSet != null && intersectSet.size > 0) {
        gid = idmpdict.get(intersectSet.head).get
      }
      nset.map(t => {
        (t, gid)
      })

    })

在这里插入图片描述

  • idmapping 字典由每天数据求出
  • 地理位置字典由爬虫获取
  • app信息字典也用爬虫获取
  • url对应的商品信息由爬虫获取
日志预处理
  • dsp日志处理
  • 行为日志处理
  • 第三方日志处理
    • 将上述字典数据加入上述日志 dsp加入全部字典 行为日志不加app字典
知识点
  • rdd 不能嵌套: 因为map中是单机的不能执行rdd
  • yield 返回数组
  • 爬虫中的核心技术点:
    1. 如何通过代码发出http请求
    2. 如何解析html文档,抽取所需要的内容
    3. 如何应对网站的反爬技术
    4. 如何进行爬取任务的调度
    • 用jsoup/httpclient实现
  • 分词HanLp
    String doc = "我有一头小毛驴我从来也不骑,有一天我心血来潮骑着去赶集";
    
        String s = HanLP.convertToPinyinFirstCharString(doc," ",false);
        System.out.println(s);
    
        List<Pinyin> pinyins = HanLP.convertToPinyinList(doc);
        System.out.println(pinyins);
    
        String s2 = HanLP.convertToTraditionalChinese(doc);
        System.out.println(s2);
    
    
        String doc2 = "娱乐圈中总少不了各路明星之间的“暗战大戏”,而近段时间闹得最沸沸扬扬的非张韶涵和范玮琪莫属。自从张韶涵事业回春之后,当初在低谷时的种种旧事就被翻了出来,当时与张韶涵之间是非难断的范玮琪自然就首当其冲成了粉丝们发泄的目标。\n" +
                "张韶涵发问号\n" +
                "    近日,针对之前的一系列负面消息,范玮琪在社交账号上开始了为自己正名的操作,回复了很多对自己有负面评价的网友,最后更是情绪大爆发问自己到底做错了什么。而这其中争议最多的,还是其与张韶涵之间的旧事。不少网友表示,张韶涵和范玮琪这段剪不断理还乱的昔日姐妹情一直上演了许多年,直到现在还没演完,看来两个人在未来也很可能要继续“捆绑”了。\n" +
                "\n";
        //关键字
        List<String> keywords = HanLP.extractKeyword(doc2, 8);
        System.out.println(keywords);
    	//摘要
        List<String> summary = HanLP.extractSummary(doc2, 4);
        System.out.println(summary);
    	//分词
        List<Term> terms = HanLP.segment(doc);
        for (Term term : terms) {
            System.out.println(term.word);
        }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值