GraphX Advent Calendar - Day 07 - VertexRDD
GraphX Advent Calendar 2014 - Adventar 7日目です。
昨日は、VertexRDD と EdgeRDD の概要について書きました。今日はVertexRDDが持つ昨日をひとつずつ見て行きたいと思います。
filter
頂点を特定の条件で抽出するための関数です。
val filteredVertices:VertexRDD[(String, Long)] = vertices.filter{ case (vid:VertexId, (name:String, value:Long)) => value > 150 }
mapValues
Day05 でも紹介した、それぞれの頂点の編集処理を行うための関数です。
val mappedVertices:VertexRDD[Long] = vertices.mapValues( (vid:VertexId, attr:(String, Long) ) => attr._2 * attr._1.length)
diff
※ diffはどうにも正しく稼働してくれないです。バグなんじゃないかと思い、issue あげています
[SPARK-4600] org.apache.spark.graphx.VertexRDD.diff does not work - ASF JIRA
leftJoin
Vertices に Vertices に JOIN させるための関数です。JOINさせるVerticesの方が足らないことがあり得ることを想定している場合に利用する関数で、ミスマッチする場合に代替的にセットする値を、 getOrElse で指定することができます。
val leftJoinedVertices = vertices.leftJoin(verticesWithCountry){ (vid, left, right) => (left._1, left._2, right.getOrElse("World")) }
innerJoin
leftJoin と同じく、Vertices に Vertices に JOIN させるための関数です。JOINさせるVerticesの方が足らないことがあり得ることを想定していない場合に利用する関数です。
val innerJoinedVertices = vertices.innerJoin(verticesWithCountry){
(vid, left, right) => (left._1, left._2, right)
}
aggregateUsingIndex
頂点情報について、IDの重複があるデータがあった場合に、それをグラフにJOINさせるには、重複を排除してあげる必要があります。
例えば、以下のような頂点があった場合に、
1,Taro,100
2,Jiro,200
3,Sabo,300
以下のような情報をJOINさせる場合です。
1,10
2,20
2,21
3,30
3,31
これを、例えば、以下のようにID毎に集約してからJOINさせる必要があります。
1,10
2,41
3,61
この場合、 aggregateUsingIndex を使います。
val auiVertices:VertexRDD[Long] = vertices.aggregateUsingIndex(verticesWithNum, _ + _)
次回予告
明日はEdgeRDDについてです。
尚、Day06からDay08までのサンプルソースはこちらで御参照いただけます。
graphx-advent-samples/Day06_08.scala at master · ironpeace/graphx-advent-samples · GitHub