开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第七阶段):统一识别_图计算】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/682/detail/11840
统一识别_图计算
图计算本身在调用的时候比较简单,没有 API,所以本节简单介绍下什么是图计算。
首先可以看到相应的两个数据集:
)).toDF( colNames="id", "name","age")
一个叫做 vertex,vertex 可以理解为一个点,点里的数据第一列是 id, 第二列是 name,第三列是 age,第二个数据集val edge = spark.createDataFrame(List(
val edge = spark.createDataFrame(List(
("a","b", "friend"),
("b","c","follow"),
("c","b","fo1low"),
("f"
,"c","follow"),
("e","f","follow"),
("e","d","friend"),
("d","a","friend"),
("a","e","friend")
)).toDF( colNames= "src","dst","relationship")
}
}
// edge 对应的是一个边,这个边里的数据有"src"一端,"dst"另一端目标,"relationship"关系,所以这个vertex 这个点描述的其实是一个人,这个人的 id、名字、年龄是多少,edge 其实是在描述。
人与人之间的关系,找到ABC的所有关系。
画一个简略的草图,
首先第一个是A,第二个B,第三个为C,接下来A和B有关系,可以连一条线,B和C有关系,连线,C和D没有关系,f和c没有关系,e"和"f",""e"和"d","d"和"a""a"和"e 都没有关系,只找有关系的A和B,B和C。如果这样,C通过B也是可以找到A的。
那么想通过一个顶点找到和所有点都关联的点需要怎么去找呢?
在写之前要导入两个 mailyilai,
把<dependency>
<groupId>graphframes</groupId>
<artifactId>graphframes</artifactId>
<version>0.7.0-spark2.4-s_2.11</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-graphx_2.11</artifactId>
<version>${spark.version}</version>
</dependency)
这一串代码导入Pom.xml
文件中,往下实现通过关系找到哪一些人是可以在一个团队里、那些人是相互有关系的需求,
spark.sparkContext.setCheckpointDir("checkpoint")
val graph = GraphFrame(vertex,edge).connectedComponents.run()
graph.show()
}
}
// 创建一个 GraphFrame,接收两个参数分别为 vertex、edge,使用 connectedComponents
划分团队关系,对图中所有点进行串联,还需调用 run 才可程序运行,获取到一张图 graph,使用 show 打印这张图,看其中信息,运行出结果后发现报错,
错误需要设置 CheckpointDir 的目录。所以在调用 run 之前,通过spark.sparkContext 来去设置一个 setCheckpointDir,目录称为"checkpoint"
。
此时再运行一遍发现还在报错,是因为 GraphFrame 和 JsonDSL$ 有冲突,需要打开 pom 文件找到
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_2.11</artifactId>
version>3.6.6</version>
</dependency>
这个 jar 包进行删除可解决。
注意:顶点这个数据集当中必须有一列叫做 id,会按照这个 id 来进行联通,边“edge”这个数据集当中必须要有两列,"src"和"dst",边的两端。把能联系起来的点放到同一个 component 中。