———————–施工中——————–
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的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