GraphX之aggregateMessages、outerJoinVertices

aggregateMessages:aggregateMessages为GraphX中核心的聚合操作,他主要的功能是向领边发送信息,合并领边收到的信息。aggregateMessages方法的定义格式为:

其中

sendMsg 看做 map reduce 过程中的 map 函数,向邻边发消息,应用到图的每个边三元组(edge

mergeMsg 指定两个消息到相同的顶点并保存为一个消息。可以将 mergeMsg 函数看做 mapreduce 过程中的 reduce

TripletFields 可选项 它指出哪些数据将被访问(源顶点特征,目的顶点特征或者两者同时,即有三种可选择的值: TripletFields.Src TripletFields.Dst TripletFields.All

首相先用一个示例图,图的内容为

scala> graph3.triplets.collect.foreach(println(_))
((1,(BarackObama,Barack Obama)),(2,(ladygaga,Goddess of Love)),1)
((2,(ladygaga,Goddess of Love)),(1,(BarackObama,Barack Obama)),1)
((4,(justinbieber,Justin Bieber)),(1,(BarackObama,Barack Obama)),1)
((6,(matei_zaharia,Matei Zaharia)),(3,(jeresig,John Resig)),1)
((7,(odersky,Martin Odersky)),(3,(jeresig,John Resig)),1)
((3,(jeresig,John Resig)),(7,(odersky,Martin Odersky)),1)
((6,(matei_zaharia,Matei Zaharia)),(7,(odersky,Martin Odersky)),1)
((7,(odersky,Martin Odersky)),(6,(matei_zaharia,Matei Zaharia)),1)

例如我们想把一个顶点的相邻顶点查看出来,并用1表示相邻顶点,例如1的相邻顶点为2和4,那么输出为(1,Map(2 -> 1, 4 -> 1)),我们可以实现通过aggregateMessages中的sendMsg 向1的相邻边发送信息,取出相邻边的顶点编号并与1组成map,然后通过mergeMsg合并所有1的领边数据。然后TripletFields设置为都访问。

scala> val first = graph3.aggregateMessages[Map[Long,Int]](triplets=>{triplets.sendToDst(Map(triplets.srcId->1))},(a,b)=>a++b,TripletFields.All)
scala> first.collect
res4: Array[(org.apache.spark.graphx.VertexId, Map[Long,Int])] = Array((6,Map(7 -> 1)), (2,Map(1 -> 1)), (1,Map(2 -> 1, 4 -> 1)), (7,Map(3 -> 1, 6 -> 1)), (3,Map(6 -> 1, 7 -> 1)))

outerJoinVertices:将其他RDD中顶点信息更新到图中。 

例如我们想把上一个的结果更新到图中

scala> val graph4=graph3.outerJoinVertices(first){case (id,attr,Some(map))=>map case(id,attr,None)=>Map()}
graph4: org.apache.spark.graphx.Graph[scala.collection.immutable.Map[_ <: Long, Int],Int] = org.apache.spark.graphx.impl.GraphImpl@7373376f

scala> graph4.triplets.collect.foreach(println(_))
((1,Map(2 -> 1, 4 -> 1)),(2,Map(1 -> 1)),1)                                     
((2,Map(1 -> 1)),(1,Map(2 -> 1, 4 -> 1)),1)
((4,Map()),(1,Map(2 -> 1, 4 -> 1)),1)
((6,Map(7 -> 1)),(3,Map(6 -> 1, 7 -> 1)),1)
((7,Map(3 -> 1, 6 -> 1)),(3,Map(6 -> 1, 7 -> 1)),1)
((3,Map(6 -> 1, 7 -> 1)),(7,Map(3 -> 1, 6 -> 1)),1)
((6,Map(7 -> 1)),(7,Map(3 -> 1, 6 -> 1)),1)
((7,Map(3 -> 1, 6 -> 1)),(6,Map(7 -> 1)),1)

case (id,attr,Some(map))=>map :表示first与graph3中顶点id一样的数据,将first的顶点属性(Some(map))保留在图中,而图graph3的顶点属性(attr)不保留。

case(id,attr,None)=>Map():表示graph3有的first没有的顶点,把顶点赋值一个空map。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值