图计算实现ID_Mapping、Oneid打通数据孤岛
图计算实现ID_Mapping、Oneid打通数据孤岛
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 同时出现两次以上才被记入同一个