干货!!基于Spark Graph的社交关系图谱项目实战

Posted 大数据兵工厂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货!!基于Spark Graph的社交关系图谱项目实战相关的知识,希望对你有一定的参考价值。

大家好,我是老兵。

本文是基于​​Spark Graphframes​​的​​社交关系图谱​​实战演练。

我将结合自身开发和项目经验,分别讲述​​社交关系图谱​​原理、​​图计算​​原理、Spark Graphframes​​图计算编程​​、​​关联推荐​​实战等内容,帮助大家快速了解Spark Graphframes图计算的使用。

有兴趣交流沟通的朋友,欢迎添加我个人微信: youlong525。

1 什么是社交关系图谱

社交关系图谱的粗浅理解,即表达社交网络中的人与群体的关系。


我是谁? 我周围人是谁?我们有什么关系?


1)业务通俗理解

比如张三是个资深​​网络​​爱好者,也是个​​圈内​​达人。我们先来看看他的圈子:​​家庭​​圈、​​同事​​圈、​​朋友​​圈、​​区域​​圈、​​兴趣​​圈等。。

干货!!基于Spark

这些圈子中的角色对象。有的和张三关系紧密,如​​亲朋好友​​;有的毫不相识,即​​潜在对象​​;有的相隔万里却因相同的一个​​兴趣​​结识。。。

干货!!基于Spark

总体而言,这就是张三的社交关系图谱(简略版)。


个体属性 + 群体关系 => 关系图谱


2)数据层面理解

在理解社交关系图谱的业务含义后,我们去看看数据层面的含义。

​群体关系​​和​​个体属性​​,从数据角度可抽象成包含多维度的数据标签。

类似: ​​张三​​(name/age/sex)、​​朋友​​(friend/non-friend..)、​​同事​​(superior、colleague...)、​​区域​​(nearby、non-nearby)等。

最终提炼成丰富的标签化的用户社交数据。

关系

标签值

朋友

0(friend)、1(non-friend) ...

同事

0(superior)、1(colleague) ...

亲戚

0(parent)、1(non-parent) ...

区域

0(nearby)、1(non-nearby)...

大多数公司的​​社交关系图谱​​建设,一般会基于企业内​​人与人​​的关系数据梳理,通过对数据的​​类型​​、​​可信强度​​,不同​​来源​​的分析,构建统一的丰富的​​社交数据体系​​,形成关系​​知识图谱​​。

2 社交关系图谱与图计算

2.1 图计算模型

上面我们将关系图谱经过​​数字化​​和​​标签化​​处理,抽象成带有​​标签​​的个体属性和关系数据。

干货!!基于Spark

再来看看此时的张三,包含​​属性特征​​和一组组的​​关系特征​​。

  • 属性特征: zhangsan<name、age、sex>
  • 关系特征:zhangsan ->(friends)-> userA

既然有了数据概念模型,​​程序​​中如何去实现呢?仔细看下,属性特征和关系特征数据在结构上符合图结构。


图由一个顶点集合和一条边(或者弧)集合组成,且每一条边都依附于顶点集合的两个顶点。
——来自百度百科


干货!!基于Spark

因此​​关系图谱​​数据在程序中可被抽象成​​"点——线"​​拓扑集合。基于此类数据结构的计算被称作​​图计算​​。

干货!!基于Spark

2.2 图计算组件

​关系图谱​​数据转换为图数据结构后,一般会使用图计算组件进行开发。

如下列举了生产中常见的​​图计算引擎​​特性,供大家参考。

1)Neo4J

  • 有很好的可视化界面,支持交互式查询
  • 小批量操作时查询效率高,对用户比较友好,适用于OLTP查询
  • 不支持数据分片,存储数据有限,数据的导入与更新操作耗时

干货!!基于Spark

2)Spark GraphX

  • spark的优点既是SparkGraphX的优点,支持海量数据
  • 重点在图计算,而非图存储和查询领域,适合OLAP领域
  • 为Scala提供接口,运算基于RDD
  • 支持常见的图算法

干货!!基于Spark

3)Spark GraphFrame

  • 运算基于Spark GraphFrame
  • 为Python、Java和Scala提供了统一的接口,能够使用GraphX的全部算法
  • 加入新的图算法(motif finding/BFS)
  • 图的存储和读取;GraphFrames与DataFrame的数据源完全兼容,支持以Parquet、Json以及Csv等格式完成图的存储与读取。

干货!!基于Spark

4)GraphFrames vs GraphX

由于环境和项目技术选型所限,本文选择​​Spark Graphframes​​。大家也可以选择​​Spark Graphx​​,且GraphFrames和GraphX可相互转化。

// GraphFrames转换为GraphX
val g: Graph[Row, Row] = gf.toGraphX()
// GraphX转换为GraphFrames
val gf: GraphFrame = GraphFrame.fromGraphX(g)

这里我也列出了​​Spark GraphX​​和​​Spark Graphframes​​的区别。

GraphFrames

GraphX

数据模型

DataFrames

RDDs

开发语言

Scala/Java/Python

Scala

使用场景

数据查询、图计算

图计算

顶点ID

Any Type

Long

点边属性

DataFrame columns

Any Type(VD, ED)

返回类型

GraphFrame、DataFrame

Graph[VD, ED] 、RDD[Long, VD]

3 Spark GraphFrames图计算实战


编程环境: Jupter
编程语言: Python
技术组件: Spark Graphframes
实现难度: 中等(可替换为Spark GraphX)


干货!!基于Spark3.1 Spark graphframes基本语法

GraphX中常用算法在GraphFrame的调用方法:

1) 创建图对象(示例)

// 定义顶点
vertices = spark.createDataFrame(
[("a", "Alice", 34), ("b", "Bob", 36)], \\
["id", "name", "age"])

// 定义边
edges = spark.createDataFrame(
[("a", "b", "friend")] , ["src", "dst", "relationship"])

// 创建图对象
graph = GraphFrame(vertices,edges)

2)获取边、角、出入度(示例)

// 计算顶点/边
graph.vertices.show()
graph.edges.show()

// 计算顶点度、出入度
graph.degrees.show()
graph.inDegrees.show()
graph.outDegrees.show()

3)依据点、边、出入度的子图筛选

graph.vertices().filter("age > 30").show()
graph.edges.filter("type == friends").show()
graph.inDegrees.filter("inDegree >= 2").show()

4)模式发现(示例)

// 获取a->b的关系
motifs = graph.find("(a)-[e]->(b)")
motifs.show()

5)基本算法(示例)

// PageRank算法
graph.pageRank().maxIter() \\
.resetProbability().run() \\
.vertices().show()

// 广度优先算法
paths = graph.bfs("name=Alice", "age > 34")
paths.show()

// 最短路径
graph.shortestPaths(landmarks=lm).show()

// 标签传播算法
graph.labelPropagation().show()

3.2 Spark Graphframes 实战—基于社交关系推荐好友

回到本文的核心,我们将​​关系图谱数据​​处理成​​图​​结构,且选择​​Spark Graphframes​​作为技术组件,下面开始实战演练。


场景分析: 社交网络中,平台会推荐你关注人的喜爱物品,同时也会推荐关注人好友列表给你。


类似于物以类聚、人以群分的道理,有相同爱好、相同圈子的人可能是你感兴趣的人。

这里举个例子:假如userA是zhangsan的朋友,userB是userA的朋友且不是zhangsan的朋友;userB和zhangsan有相同兴趣,则将userB推荐给zhangsan。

干货!!基于Spark


逻辑分析: A->B and B -> C and A >< C,即A与B双向关系、B与C双向关系,但是A->C没有关系,输出(A,C)


1)配置环境

  • 环境中安装graphframes-xx.jar包,并指向安装位置
  • 代码中引入graphframes依赖
from pyspark.sql import SparkSession
from pyspark import SparkContext
from graphframes import *
from pyspark.sql.functions import *

// 定义SparkContext
conf = SparkConf().set("", "")

// 添加graphframes-xx.jar依赖包
spark = SparkSession \\
.builder 以上是关于干货!!基于Spark Graph的社交关系图谱项目实战的主要内容,如果未能解决你的问题,请参考以下文章

基于Spark+Grafana可视化电商项目实战,好文收藏~

html “Open Graph协议使任何网页都成为社交图谱中的丰富对象。” - http://ogp.me/

REACT-D3 network-visual-graph(关系图谱)

最全open graph protocol(开放图谱协议) 介绍操作指南

从社交图谱出发,Relation专注成为Web3社交关系数据探索者

综述 | 知识图谱(Knowledge graph)链路预测(Link Prediction)