GraphX:RDD详解

———————–施工中——————–

VertexRDDs

1.filter

过滤出符合条件的点集

scala> val graph = GraphLoader.edgeListFile(sc, "file:///home/hadoop/1.txt")
scala> graph.vertices.filter{case(id, v) => id > 5}

2.mapValues

map方法改变点的属性

scala> graph.vertices.mapValues( _ => 2).collect
scala> graph.vertices.mapValues( v => 3).collect
scala> graph.vertices.mapValues((_,v) => 4).collect

注意:mapValues操作之后,原graph的vertices的值不变,生成一个新副本,后面直接collect可显示操作结果,或者复制给一个新的变量。

3.minus

从点集1中除去点集1和点集2的交集

scala> val graph2 = GraphLoader.edgeListFile(sc, "file:///home/hadoop/2.txt")
scala> graph.vertices.minus(graph2.vertices)

4.innerJoin & leftJoin

类比于SQL的Join操作,innerJoin返回setA和setB中共有的点集,leftJoin只返回setA

setA:
这里写图片描述
setB:
这里写图片描述

innerJoin:下面程序中,a为setA的值,b为setB的值,顺序是固定的,id不能省略

scala> val setC: VertexRDD[Double] = setA.innerJoin(setB)((id, a, b ) => a + b)
scala> setC.colletc

这里写图片描述

leftJoin:a为左集合值,b为右集合值,但在=>右侧的表达式中不能出现b

scala> val setD: VertexRDD[Double] = setA.leftJoin(setB)((id, a, b ) => a + 5)
scala> setD.colletc

这里写图片描述

scala> val setD: VertexRDD[Double] = setB.leftJoin(setA)((id, a, b ) => a + 5)
scala> setD.colletc

这里写图片描述

5.aggregateUsingIndex

从一个RDD[(VertexID, A)]高效地构建一个新的VertexRDD,高效!

scala> val tmp1: RDD[(VertexId, Int)] = sc.parallelize(0L until 10L).map(id => (id, 1))
scala> val tmp2: RDD[(VertexId, Double)] = sc.parallelize(0L until 20L).flatMap(id => List((id, 2.0), (id, 3.0)))
scala> tmp1.collect
scala> tmp2.collect

这里写图片描述
这里写图片描述
注意:flatMap的用法


scala> val setA: VertexRDD[Int] = VertexRDD(tmp1)
scala> val setB: VertexRDD[Double] = VertexRDD(tmp2)

注意:虽然tmp2长度为40,但Vertex(tmp2)生成的setB长度为20,只取tmp2每个ID的第一个值:

scala> setA.collect
scala> setB.collect

setA
setB


按照setA的index,从tmp2中选取对应setA中的ID,对相对应的同一个VertexId的点的属性做加法运算,结果如下

scala> val setB: VertexRDD[Double] = setA.aggregateUsingIndex(tmp2, _+_)
scala> setB.collect

这里写图片描述

注意:_+_表示对相应Id的所有值求和,不仅仅是2个,而是n个,相应的减法_-_ 乘法_*_ 除法_/_ 等都可以,其实质其实是对tmp2按Id执行reduce方法(reduceByKey)


EdgeRDDs

改变边属性:

scala> graph.edges.mapValues( _ => 4).collect

调转边的方向:

scala> graph.reverse

过滤:

scala> graph.edges.filter(e => e.srcId > e.dstId).collect
scala> graph.edges.filter(e.attr == 3).collect

innerJoin:把两个边集共有的边(起点终点相同,attr不需要相同)取出来,a+b是新边集的attr

scala> graph1.edges.innerJoin(graph2.edges)((id1,id2,a,b) => a + b).collect
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值