圖計算實現ID_Mapping、Oneid打通資料孤島
阿新 • • 發佈:2020-08-08
圖計算實現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 同時出現兩次以上才被記入同一個
// .map(edge => (edge, 1))