ID_Mapping与Oneid的作用

大神告诉我们Oneid能用来做什么

输入数据源格式样例

样例数据图1

整理后数据图2

实现原理

联通图

生成最大联通图

留下耀总的数据给大家练习了

当日代码生成


  1. import java.util.UUID
  2. import cn.scfl.ebt.util.UtilTool
  3. import org.apache.spark.SparkContext
  4. import org.apache.spark.graphx._
  5. import org.apache.spark.sql.SparkSession
  6. import org.spark_project.jetty.util.StringUtil
  7. /**
  8. * @Author: baierfa
  9. * @version: v1.0
  10. * @description: id_mapping 单天实现暂时不加入多天滚动计算 多天计算需要看另一文件YeAndTodayGraphx
  11. * @Date: 2020-07-05 10:24
  12. */
  13. object TodayGraphx {
  14. def main(args: Array[String]): Unit = {
  15. //声明环境变量
  16. val spark = SparkSession
  17. .builder
  18. .appName(s"${this.getClass.getName}")
  19. .master("local[*]")
  20. .getOrCreate()
  21. val sc = spark.sparkContext
  22. val todayPath = "D:\\TESTPATH\\inputpath\\today\\dt=202-07-13"
  23. val outPutPath="D:\\TESTPATH\\outtpath\\today\\dt=202-07-13"
  24. val edgeoutPutPath="D:\\TESTPATH\\edgepath\\today\\dt=202-07-13"
  25. todayIdMapping(spark,sc,todayPath,outPutPath,edgeoutPutPath)
  26. spark.close()
  27. }
  28. /**
  29. * 功能描述: <输入今天数据路径 按照文件形式输出到指定路径中 并推出今日图计算点与边集合总个数>
  30. * 〈使用今日输入数据转换成唯一数字值 图计算之后再将数值转换回明文 生成唯一uuid〉
  31. * @Param: [spark, sc, todayPath, outPutPath, edgeoutPutPath]
  32. * @Return: void
  33. * @Author: baierfa
  34. * @Date: 2020-08-05 10:18
  35. */
  36. def todayIdMapping(spark:SparkSession,sc: SparkContext,todayPath: String,outPutPath:String ,edgeoutPutPath:String )={
  37. // 一、数据加载
  38. // 今天数据加载
  39. val todaydf = spark.read.textFile(todayPath)
  40. // 二、处理数据为生成图做准备
  41. // 生成今日点集合
  42. val to_veritx = todaydf.rdd.flatMap(line => {
  43. // 将数据源进行分割
  44. val field = line.split("\t")
  45. //把数据转换成(long,值)要想long值不重复 可以使用hashcode
  46. //本文用于生产环境 使用了md5加密 详细文件请看其他篇章
  47. for (ele <- field if StringUtil.isNotBlank(ele)&&(!"\\N".equals(ele))) yield (UtilTool.getMD5(ele), ele)
  48. })
  49. // 生成今日边集合
  50. val to_edges = todaydf.rdd.flatMap(line => {
  51. // 将数据源进行分割
  52. val field = line.split("\t")
  53. //将数据转换 将值转换成边 用于连线 连线值这边用""想更换看个人意愿
  54. for (i <- 0 to field.length - 2 if StringUtil.isNotBlank(field(i))&&(!"\\N".equals(field(i)))
  55. ;j <- i + 1 to field.length - 1 if StringUtil.isNotBlank(field(j))&&(!"\\N".equals(field(j))))
  56. yield Edge(UtilTool.getMD5(field(i)), UtilTool.getMD5(field(j)), "")
  57. })
  58. // 在数据不做多次etl数据操作下可以使用共同出现次数来判定是否归并为同一个用户
  59. // 例如 合并起来用户 mobile 与 device_id 同时出现两次以上才被记入同一个
  60. // .map(edge => (edge, 1))
  61. // .reduceByKey(_ + _)
  62. // .filter(tp => tp._2 > 2)
  63. // .map(tp => tp._1)
  64. // 三、汇总各个节点使用图计算生成图
  65. // 单将数据重新赋值适用于以后多数据源合并
  66. val veritx = to_veritx
  67. val edges = to_edges
  68. // 开始使用点集合与边集合进行图计算训练
  69. val graph = Graph(veritx, edges)
  70. // 四、生成最大连通图
  71. val graph2 = graph.connectedComponents()
  72. val vertices = graph2.vertices
  73. // 五、将最小图计算值替换成uuid
  74. val uidRdd = vertices.map(tp => (tp._2, tp._1))
  75. .groupByKey()
  76. .map(tp => (StringUtil.replace(UUID.randomUUID().toString, "-", ""), tp._2))
  77. // 对点与边进行统计作为记录输出 可以用于后期统计检查生成报表警报数据是否异常
  78. val uu = veritx.map(lin=>("vertices",1)).union(edges.map(lin=>("edges",1))).reduceByKey(_ + _)
  79. .map(tp=>tp._1+"\t"+tp._2)
  80. // 将现有的数据转换成铭文识别后展示
  81. // 将各个点的数据汇总到driver端
  82. val idmpMap = veritx.collectAsMap()
  83. // 按照map方式广播出去做转换
  84. val bc = sc.broadcast(idmpMap)
  85. // 将数据的id转换成明文
  86. val ss = uidRdd.mapPartitions(itemap => {
  87. val vert_id_map = bc.value
  88. itemap.map(tp => {
  89. //从广播变量中获取id值的信息并转换
  90. val t2 = for (ele <- tp._2) yield vert_id_map.get(ele).get
  91. //按照将要输出的数据格式进行排版 (uuid mobile1,mobile2,mobile3,device_id1,device_2)
  92. tp._1+"\t"+t2.mkString(",")
  93. })
  94. })
  95. // 数据输出
  96. ss.saveAsTextFile(outPutPath)
  97. uu.saveAsTextFile(edgeoutPutPath)
  98. }
  99. }

引用jar包

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <spark.version>2.4.0</spark.version>
  4. <java.version>1.8</java.version>
  5. </properties>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.apache.spark</groupId>
  9. <artifactId>spark-sql_2.11</artifactId>
  10. <version>${spark.version}</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.spark</groupId>
  14. <artifactId>spark-core_2.11</artifactId>
  15. <version>${spark.version}</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.spark</groupId>
  19. <artifactId>spark-graphx_2.11</artifactId>
  20. <version>${spark.version}</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.thoughtworks.paranamer</groupId>
  24. <artifactId>paranamer</artifactId>
  25. <version>2.8</version>
  26. </dependency>
  27. </dependencies>
  28. 启动命令
  1. spark-submit \
  2. --class IdMapping \
  3. --master yarn \
  4. --deploy-mode cluster \
  5. --num-executors 40 \
  6. --driver-memory 4g \
  7. --executor-memory 6g \
  8. --executor-cores 3 \
  9. --conf spark.default.parallelism=400 \
  10. --conf spark.shuffle.memoryFraction=0.3 \
  11. ID_Mapping_Spark.jar \
  12. hdfs://user/hive/oneid_data/data_origindata_di/dt=2020-07-13 \
  13. hdfs://user/hive/oneid_data/data_sink_id_mapping/dt=2020-07-14 \
  14. hdfs://user/hive/oneid_data/data_sink_edge_vertex/dt=2020-07-14

辛苦码字如有转载请标明出处谢谢!——拜耳法

都看到这里了非常感谢!
本片章暂未完结 有疑问请+vx :baierfa

PS:我要在下一章在我心中不完美的你打一个淋漓尽致的标签

将大神挂在那片白云下: oneid与用户标签之间的相互打通 实现用户标签

图计算实现ID_Mapping、Oneid打通数据孤岛的更多相关文章

  1. Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark实战高手之路】

    Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交 ...

  2. Spark入门实战系列--9.Spark图计算GraphX介绍及实例

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理 ...

  3. 明风:分布式图计算的平台Spark GraphX 在淘宝的实践

    快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...

  4. 开源图计算框架GraphLab介绍

    GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...

  5. 关于图计算和graphx的一些思考[转]

    原文链接:http://www.tuicool.com/articles/3MjURj “全世界的网络连接起来,英特纳雄耐尔就一定要实现.”受益于这个时代,互联网从小众的角落走到了历史的中心舞台.如果 ...

  6. FPGA计算3行同列数据之和

    实验:FPGA计算3行同列数据之和 实验要求:PC机通过串口发送3行数据(一行有56个数据,3行共有56*3=168个数据)给FPGA,FPGA计算3行同一列数据的和,并将结果通过串口返回给上位机. ...

  7. 同步图计算:GraphLite的安装和使用

    http://blog.csdn.net/pipisorry/article/details/51350908 export HADOOP_HOME=/usr/local/hadoop-2.6.4ex ...

  8. Spark(十七)图计算GraphX

    一.图概念术语 1.1 基本概念 图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种数据结构. 这里的图并非指代数中的图.图可以对事物以及事物之间的关系建模,图可以用来表示自然发 ...

  9. tensorflow入门教程和底层机制简单解说——本质就是图计算,自动寻找依赖,想想spark机制就明白了

    简介 本章的目的是让你了解和运行 TensorFlow! 在开始之前, 让我们先看一段使用 Python API 撰写的 TensorFlow 示例代码, 让你对将要学习的内容有初步的印象. 这段很短 ...

随机推荐

  1. XSS原理及代码分析

    前言 XSS又叫跨站脚本攻击,是一种对网站应用程序的安全漏洞攻击技术.它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响.XSS分为三种:反射型,存储型,和DOM型.下面我会构造有缺陷的代 ...

  2. CSS文本控制

    CSS文本控制 文本基础设置 字体设置 font-family可定义多个字体,系统会以从左至右的顺序进行查找,如左侧字体不存在,就往右侧找. 为什么要这么做呢?如果你只用了一种字体,而恰好人家电脑上没 ...

  3. 使用themeleaf,在JavaScript中使用for循环报错.....

    在for循环前加上/* <![CDATA[ */,在for循环后加/* ]]> */,这样就能正常解析了:如下 /* <![CDATA[ */ for (var i = 0; i & ...

  4. UVA1104 芯片难题 Chips Challenge

    题目链接 题意 网格上放点,有些强制放,有些不能放,有些可以放可以不放.要求: 第 \(i\) 行的点数 = 第 \(i\) 列的点数 每一行每一列的点数不超过总点数的 \(k\) 倍(\(k\) 已 ...

  5. Java线程的6种状态及切换

    Java中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法.2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...

  6. Spring Security系列之极速入门与实践教程

    @ 目录 1. Spring Security 2. 实验环境准备 3. 日志级别修改 4. 配置用户名/密码 5. 数据库方式校验 6. 不拦截静态资源 7. 自定义登录页面 8. Remember ...

  7. ~~网络编程(四):socket套接字~~

    进击のpython ***** 网络编程--socket socket的中文意思叫做套接字,socket方法其实也叫套接字方法 我们研究过TCP/UDP协议,但是要是让我们自己搭建,就十分困难了 而这 ...

  8. Btree索引和Hash索引

    B-Tree 索引 BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符, ...

  9. 浅谈Redis未授权访问漏洞

    Redis未授权访问漏洞 Redis是一种key-value键值对的非关系型数据库 默认情况下绑定在127.0.0.1:6379,在没有进行采用相关的策略,如添加防火墙规则避免其他非信任来源ip访问等 ...

  10. proj0的具体实现 #CS61B-sp18

    https://github.com/Centurybbx/sp18-century/tree/master/proj0 proj0的具体实现在上面的Github中. 在proj0中我明显感受到国外大 ...