最近在使用图计算 涉及到用户的关系 折腾了好几天
第一步:先看下用户生成的neo4j图吧 =====》》》这个是拿了一位大佬的测试数据图
生成这个图的逻辑很简单,只需要创建csv文件
举例:
用户的邀请关系 :
csv1 列名 user_id:ID,:LABEL (里面是用户ID及我写了一个节点名称)
csv2 列名 :START_ID,name,:END_ID,:TYPE (我这里先放了用户邀请ID,及被邀请人用户ID,其他两个字段是名称)
注意⚠️:
1.字段名是有:这个符号的,csv文件对格式的要求挺严格的
2.放的是csv文件,而非文件夹,因为一般sparkjob生成的都是文件夹
3.csv文件不可以有重复的值,写进去记得去重下
第二步:使用spark graphx
1.学习肯定要先去官网快速的学习一下 http://spark.apache.org/docs/latest/graphx-programming-guide.html#neighborhood-aggregation
2.了解了基础的知识,可以自己写了,加入jar包
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-graphx_${scala.main.version}</artifactId>
<version>${spark.version}</version>
</dependency>
3.最重要的一点!!!!
看需求是要的什么数据,如果是要用户的二度人脉的话,可以参看这个代码
import org.apache.spark.graphx._
val edges: RDD[Edge[ED]] = sc.textFile(s"").map(line => {
val tokens = line.split(",")
Edge[ED](tokens(0).toLong, tokens(1).toLong, null)
})
val graph: Graph[VD, ED] = Graph.fromEdges[VD, ED](edges, VD(mutable.Map[Long, Long]()))
val reverseGraph = graph.reverse
val relate: VertexRDD[List[Long]] = reverseGraph.aggregateMessages[List[Long]](
triplet => {
triplet.sendToDst(List(triplet.srcId))
},
(a,b) => (a++b)
)
val userArrayDF = relate.map( m=> {
val a =m._1.toLong
m._2.:+(a)
} )
备注: 这里面的text文件格式就是普通的(1,2)这种
然后如果是要和这个用户有关系的所有用户的话,可以参考这个代码(顺便含泪吐槽下~这玩意我整了好久好久)
val compactBufferRDD = graph.connectedComponents
.vertices
.map(_.swap)
.groupByKey()
.map(_._2)
因为我的需求是用户形成组,那么每天用户的关系都是不同的,传统的方法就是for循环,那么多数据for循环要很久,我又跑过5哥小时左右,用了这个方法之后,那速度简直了~~