idmp用户唯一标识图计算模拟演示

idmp用户唯一标识

需求出现原因:

现在一般网站所有账号登陆,账号就是用户的唯一标识
但是部分网站也存在一些以游客模式进行浏览消费的事件,
这个时候就需要利用**图计算(graphx)**的方法计算出用户的唯一标识.

图计算逻辑:

将所有数据中产生的的 id码,imsi码,mac码…所有编码汇总起来形成点集合,
将行数不同但是点集合中元素相同的数据 相同编码程度值>阈值的不同行的数据被计算为同一个用户,
并且打上用户的唯一标识 guid

举例论证:

数据(idmapping小型测试数据.txt):

13866778899,刘德华,wx_hz,2000
13866778899,华仔,wx_hz,3000
,刘德华,wx_hz,5000
13812344321,马德华,wx_mdh,12000
13812344321,二师兄,wx_mdh,3500
13812344321,猪八戒,wx_mdh,5600

这是6条数据但是只有两个用户!
1.创建spark环境导入数据

//创建spark环境
    val spark: SparkSession = SparkSession.builder()
      .appName(this.getClass.getSimpleName)
      .master("local[*]")
      .getOrCreate()
    spark
    
//隐式转换
    import spark.implicits._

//导入数据
    val dt: Dataset[String] = spark.read.textFile("data/graphx/idmapping小型测试数据.txt")

2.创建点集合scala写法

//取出点,每个点我们要放在一个rdd里
    val ver: RDD[(Long, String)] = dt.rdd.flatMap(row => {
      val fields: Array[String] = row.split(",")
                       //如果数据如果不为空则参运算
     for(ele <-fields if StringUtils.isNotBlank(ele)) yield (ele.hashCode.toLong,ele)

(第二种)创建点集合java写法

//在spark中 点 需要表示成一个tuble(k,v)==> (k:点的唯一标识我们用fields(0).hashcode来表示,v:就是第一个数据fields(0))用数组接受
    val ver: RDD[(Long, String)] = dt.rdd.flatMap(row => {
      val fields: Array[String] = row.split(",")
      Array((fields(0).hashCode.toLong, fields(0)),
            (fields(1).hashCode.toLong, fields(1)),
            (fields(2).hashCode.toLong, fields(2))
       )

3.创建边集合scala写法

   //在构造一个边的rdd
    //spark中的对边的描述 edge(起始id,目标id,边数据)
    val edges: RDD[Edge[String]] = dt.rdd.flatMap(row => {
      val fields = row.split(",")
      //scala风格  简单  yield本来是个数组返回的还是个数组就不用创建可变的集合来收集数据了
      // Edge 的参数一:第一个点.   参数二:下一个点.   参数三:边的数据或者边的属性,这里我们用空串表示
      for(i<-0 to fields.length -2 if StringUtils.isNotBlank(fields(i)))yield Edge(fields(i).hashCode.toLong, fields(i + 1).hashCode.toLong, "")
    })

(第二种)创建边集合java写法

   //在构造一个边的rdd
    //spark中的对边的描述 edge(起始id,目标id,边数据)
    val edges: RDD[Edge[String]] = dt.rdd.flatMap(row => {
      val fields = row.split(",")
    //java风格写法先创建一个可变的集合来接手数据
    val lst = new ListBuffer[Edge[String]]()
    
       for (i <- 0 to fields.length - 2) {
         val edge1 = Edge(fields(i).hashCode.toLong, fields(i + 1).hashCode.toLong, "")
        //一条一条的进入到可变的集合中
         lst += edge1
       }
      

4.将点集合 和 边集合 结合起来

//用 点集合 和 边集合 构造一张图 (最大连同子图) 使用Graph算法
    val graph = Graph(ver,edges)

//用graph.connectedComponents()算法 不传参数就是彻底迭代的  传参数就是限量跌代
    val graph2: Graph[VertexId, String] = graph.connectedComponents()

//将组中的每一个元和这一组中的最小的元素结合成一个元组可以将每个元素中最小的元素当成这一组的唯一标识
    val vertices2: VertexRDD[VertexId] = graph2.vertices
//打印出来看
   vertices2.take(30).foreach(println)
   打印结果(hashCode	值,右边为每个组中最小的元素):
    (29003441,-774337709)
    (-774337709,-774337709) 
    (20090824,-774337709)    
    (38771171,-774337709)
    (208397334,548618674)
    (1537214,548618674)
    (8958655,548618674)

5.用我们的计算结果来加工我们的原始数据

//将上面得到点得映射关系rdd,收集到Driver端
    val idmpMap = vertices2.collectAsMap()
//广播出去
    val bc = spark.sparkContext.broadcast(idmpMap)
//利用映射关系结果来加工我们的额原始数据
    val res: Dataset[String] = dt.map(row => {
      val bc_map = bc.value
//StringUtils.isNotBlank(_)不能为空
      val name = row.split(",").filter(StringUtils.isNotBlank(_))(0)
      val gid: VertexId = bc_map.get(name.hashCode.toLong).get
 //返回
      gid + "," + row
    })
    res.show(10,false)
    代码实现:
+---------------------------------------+
|value                                  |
+---------------------------------------+
|681286,13866778899,刘德华,wx_hz,2000      |
|681286,13866778899,华仔,wx_hz,3000       |
|681286,,刘德华,wx_hz,5000                 |
|-774337709,13812344321,马德华,wx_mdh,12000|
|-774337709,13812344321,二师兄,wx_mdh,3500 |
|-774337709,13812344321,猪八戒,wx_mdh,5600 |
+---------------------------------------+

最终我们的条数据成功点被我们计算成立两条数据

课程简介:  本项目课程是一门极具综合性和完整性的大型项目课程;课程项目的业务背景源自各类互联网公司对海量用户浏览行为数据和业务数据分析的需求及企业数据管理、数据运营需求。 本课程项目涵盖数据采集与预处理、数据仓库体系建设、用户画像系统建设、数据治理(元数据管理、数据质量管理)、任务调度系统、数据服务层建设、OLAP即席分析系统建设等大量模块,力求原汁原味重现一个完备的企业级大型数据运营系统。  拒绝demo,拒绝宏观抽象,拒绝只讲不练,本课程高度揉和理论与实战,并兼顾各层次的学员,真正从0开始,循序渐进,每一个步骤每一个环节,都会带领学员从需求分析开始,到逻辑设计,最后落实到每一行代码,所有流程都采用企业级解决方案,并手把手带领学员一一实现,拒绝复制粘贴,拒绝demo化的实现。并且会穿插大量的原创解,来帮助学员理解复杂逻辑,掌握关键流程,熟悉核心架构。   跟随项目课程,历经接近100+小时的时间,从需求分析开始,到数据埋点采集,到预处理程序代码编写,到数仓体系搭建......逐渐展开整个项目的宏大视,构建起整个项目的摩天大厦。  由于本课程不光讲解项目的实现,还会在实现过程中反复揉和各种技术细节,各种设计思想,各种最佳实践思维,学完本项目并勤于实践的话,学员的收获将远远超越一个项目的具体实现,更能对大型数据系统开发产生深刻体悟,对很多技术的应用将感觉豁然开朗,并带来融会贯通能力的巨大飞跃。当然,最直接的收获是,学完本课程,你将很容易就拿到大数据数仓建设或用户画像建设等岗位的OFFER课程模块: 1. 数据采集:涉及到埋点日志flume采集系统,sqoop业务数据抽取系统等; 2. 数据预处理:涉及到各类字典数据构建,复杂结构数据清洗解析,数据集成,数据修正,以及多渠道数据的用户身份标识打通:ID-MAPPING等;3. 数据仓库:涉及到hive数仓基础设施搭建,数仓分层体系设计,数仓分析主题设计,多维分析实现,ETL任务脚本开发,ETL任务调度,数据生命周期管理等;4. 数据治理:涉及数据资产查询管理,数据质量监控管理,atlas元数据管理系统,atlas数据血缘管理等;5. 用户画像系统:涉及画像标签体系设计,标签体系层级关系设计,各类标签计算实现,兴趣类标签的衰减合并,模型标签的机器学习算法应用及特征提取、模型训练等;6. OLAP即席分析平台:涉及OLAP平台的整体架构设计,技术选型,底层存储实现,Presto查询引擎搭建,数据服务接口开发等;7. 数据服务:涉及数据服务的整体设计理念,架构搭建,各类数据访问需求的restapi开发等;课程所涉及的技术: 整个项目课程中,将涉及到一个大型数据系统中所用到的几乎所有主要技术,具体来说,包含但不限于如下技术组件:l Hadoopl Hivel HBasel SparkCore /SparkSQL/ Spark GRAPHX / Spark Mllibl Sqoopl Azkabanl Flumel lasal Kafkal Zookeeperl Solrl Prestop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值