ID_Mapping与Oneid的作用

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

输入数据源格式样例

样例数据图1

整理后数据图2

实现原理

联通图

生成最大联通图

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

当日代码生成


import java.util.UUID
import cn.scfl.ebt.util.UtilTool
import org.apache.spark.SparkContext
import org.apache.spark.graphx._
import org.apache.spark.sql.SparkSession
import org.spark_project.jetty.util.StringUtil /**
* @Author: baierfa
* @version: v1.0
* @description: id_mapping 单天实现暂时不加入多天滚动计算 多天计算需要看另一文件YeAndTodayGraphx
* @Date: 2020-07-05 10:24
*/
object TodayGraphx {
def main(args: Array[String]): Unit = { //声明环境变量
val spark = SparkSession
.builder
.appName(s"${this.getClass.getName}")
.master("local[*]")
.getOrCreate()
val sc = spark.sparkContext
val todayPath = "D:\\TESTPATH\\inputpath\\today\\dt=202-07-13"
val outPutPath="D:\\TESTPATH\\outtpath\\today\\dt=202-07-13"
val edgeoutPutPath="D:\\TESTPATH\\edgepath\\today\\dt=202-07-13" todayIdMapping(spark,sc,todayPath,outPutPath,edgeoutPutPath)
spark.close()
} /**
* 功能描述: <输入今天数据路径 按照文件形式输出到指定路径中 并推出今日图计算点与边集合总个数>
* 〈使用今日输入数据转换成唯一数字值 图计算之后再将数值转换回明文 生成唯一uuid〉
* @Param: [spark, sc, todayPath, outPutPath, edgeoutPutPath]
* @Return: void
* @Author: baierfa
* @Date: 2020-08-05 10:18
*/
def todayIdMapping(spark:SparkSession,sc: SparkContext,todayPath: String,outPutPath:String ,edgeoutPutPath:String )={
// 一、数据加载 // 今天数据加载
val todaydf = spark.read.textFile(todayPath)
// 二、处理数据为生成图做准备
// 生成今日点集合
val to_veritx = todaydf.rdd.flatMap(line => {
// 将数据源进行分割
val field = line.split("\t")
//把数据转换成(long,值)要想long值不重复 可以使用hashcode
//本文用于生产环境 使用了md5加密 详细文件请看其他篇章
for (ele <- field if StringUtil.isNotBlank(ele)&&(!"\\N".equals(ele))) yield (UtilTool.getMD5(ele), ele)
})
// 生成今日边集合
val to_edges = todaydf.rdd.flatMap(line => {
// 将数据源进行分割
val field = line.split("\t")
//将数据转换 将值转换成边 用于连线 连线值这边用""想更换看个人意愿
for (i <- 0 to field.length - 2 if StringUtil.isNotBlank(field(i))&&(!"\\N".equals(field(i)))
;j <- i + 1 to field.length - 1 if StringUtil.isNotBlank(field(j))&&(!"\\N".equals(field(j))))
yield Edge(UtilTool.getMD5(field(i)), UtilTool.getMD5(field(j)), "")
})
// 在数据不做多次etl数据操作下可以使用共同出现次数来判定是否归并为同一个用户
// 例如 合并起来用户 mobile 与 device_id 同时出现两次以上才被记入同一个
// .map(edge => (edge, 1))
// .reduceByKey(_ + _)
// .filter(tp => tp._2 > 2)
// .map(tp => tp._1) // 三、汇总各个节点使用图计算生成图
// 单将数据重新赋值适用于以后多数据源合并
val veritx = to_veritx
val edges = to_edges
// 开始使用点集合与边集合进行图计算训练
val graph = Graph(veritx, edges)
// 四、生成最大连通图
val graph2 = graph.connectedComponents()
val vertices = graph2.vertices
// 五、将最小图计算值替换成uuid
val uidRdd = vertices.map(tp => (tp._2, tp._1))
.groupByKey()
.map(tp => (StringUtil.replace(UUID.randomUUID().toString, "-", ""), tp._2))
// 对点与边进行统计作为记录输出 可以用于后期统计检查生成报表警报数据是否异常
val uu = veritx.map(lin=>("vertices",1)).union(edges.map(lin=>("edges",1))).reduceByKey(_ + _)
.map(tp=>tp._1+"\t"+tp._2)
// 将现有的数据转换成铭文识别后展示
// 将各个点的数据汇总到driver端
val idmpMap = veritx.collectAsMap()
// 按照map方式广播出去做转换
val bc = sc.broadcast(idmpMap)
// 将数据的id转换成明文
val ss = uidRdd.mapPartitions(itemap => {
val vert_id_map = bc.value
itemap.map(tp => {
//从广播变量中获取id值的信息并转换
val t2 = for (ele <- tp._2) yield vert_id_map.get(ele).get
//按照将要输出的数据格式进行排版 (uuid mobile1,mobile2,mobile3,device_id1,device_2)
tp._1+"\t"+t2.mkString(",")
})
})
// 数据输出
ss.saveAsTextFile(outPutPath)
uu.saveAsTextFile(edgeoutPutPath)
}
}

引用jar包

 <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spark.version>2.4.0</spark.version>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency> <dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency> <dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-graphx_2.11</artifactId>
<version>${spark.version}</version>
</dependency> <dependency>
<groupId>com.thoughtworks.paranamer</groupId>
<artifactId>paranamer</artifactId>
<version>2.8</version>
</dependency> </dependencies>
启动命令
spark-submit \
--class IdMapping \
--master yarn \
--deploy-mode cluster \
--num-executors 40 \
--driver-memory 4g \
--executor-memory 6g \
--executor-cores 3 \
--conf spark.default.parallelism=400 \
--conf spark.shuffle.memoryFraction=0.3 \
ID_Mapping_Spark.jar \
hdfs://user/hive/oneid_data/data_origindata_di/dt=2020-07-13 \
hdfs://user/hive/oneid_data/data_sink_id_mapping/dt=2020-07-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. 01-flask电商项目开发基础配置

    本项目前端采用vue-cli的脚手架,后端采用Flask的Web框架.项目通过完成用户管理.权限管理.商品管理.订单管理.统计管理等功能,综合了前后端的知识,希望使大家都能受益. 1.使用到的技术如下 ...

  2. (5)webpack中url-loader的使用

    为什么要使用url-loader 在前面已经介绍了css文件可以使用第三方loader去加载. 在一个项目中,也不仅仅只有html,js和css文件,还有图片文件,字体文件等等.当我们给一个css样式 ...

  3. T1 找试场 题解

    拖延症又犯了QwQ. 今天上午考试了,按照惯例,我仍然要把我会的所有题的题解写一遍. 1.找试场(way.cpp/in/out) 问题描述 小王同学在坐标系的(0,0)处,但是他找不到考试的试场,于是 ...

  4. Python数据分析之全球人口数据

    这篇文章用pandas对全球的人口数据做个简单分析.我收集全球各国1960-2019年人口数据,包含男女和不同年龄段,共6个文件. pop_total.csv: 各国每年总人口 pop_female. ...

  5. nginx的基础学习+实战

    文章目录 一.前言 二.反向代理 三.负载均衡 四.动静分离 参考视频:尚硅谷Nginx教程(2019发布) 参考链接:Windows下Nginx负载均衡实现 一.前言 Nginx (engine x ...

  6. 数据库-SQL查询语言(一)

    SQL数据定义 DDL sql的DDL不仅能定义一组关系,还能定义每个关系的信息,包括: 每个关系的模式 每个属性的取值类型 完整性约束 每个关系的维护的索引集合 每个关系的安全性和权限信息 每个关系 ...

  7. Sharding-Proxy的基本功能使用

    Sharding-Proxy是一个分布式数据库中间件,定位为透明化的数据库代理端.作为开发人员可以完全把它当成数据库,而它具体的分片规则在Sharding-Proxy中配置.它的整体架构图如下: 在架 ...

  8. python基础--小数据池,代码块的最详细、深入剖析

    本文转至太白金星 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存 ...

  9. 缓存利器、Lua模块下的共享内存

    上一节讲到了worker进程的共享内存,它利用丰富的指令使数据的缓存操作变得非常简单,但它也存在一些缺点. 1.worker进程之间会有锁竞争,在高并发的情况下会增加性能开销.2.只支持Lua布尔值. ...

  10. lua判断字符串包含另一个字符串

    lua判断字符串包含另一个字符串 --string.find("元字符串","模式字符串") 如下: print(string.find("CCBWe ...