GraphX Advent Calendar - Day 04 - 表構造データからグラフデータを生成する
GraphX Advent Calendar 2014 - Adventar 4日目です。
Day03では、辺の構造のデータからグラフデータを生成しましたが、今日は、普通の表構造のデータからグラフデータを生成してみます。
読み込み時に複雑なデータモデルから読み込み
GraphLoader.edgeListFileで辺情報からグラフを生成するのは、シンプルな例です。本格的な開発の場合には、頂点情報と辺情報のふたつからグラフを生成します。
Day02でも簡単な例を示しましたが、今日はもう少し複雑なデータからグラフを生成します。
master.csv
id | name | value |
1 | Taro | 100 |
2 | Jiro | 200 |
3 | Sabo | 300 |
connection.csv
id | from | to | value | date |
1 | 1 | 2 | 100 | 2014/12/1 |
2 | 2 | 3 | 200 | 2014/12/2 |
3 | 3 | 1 | 300 | 2014/12/3 |
まずは頂点情報をRDDにロードします。
val vertexLines = sc.textFile("graphdata/day02-02-vertices.csv") val vertices: RDD[(VertexId, (String, Long))] = vertexLines.map(line => { val cols = line.split(",") (cols(0).toLong, (cols(1), cols(2).toLong)) })
頂点クラスを、RDD[(VertexId, (String, Long))] と宣言しています。これは頂点情報として、(String, Long)のタプル型の値を持つということです。この宣言に従って、CSVから読み込んだ値をセットしています。
次に、辺情報をRDDにロードします。
val format = new java.text.SimpleDateFormat("yyyy/MM/dd") val edgeLines = sc.textFile("graphdata/day02-02-edges.csv") val edges:RDD[Edge[((Long, java.util.Date))]] = edgeLines.map(line => { val cols = line.split(",") Edge(cols(0).toLong, cols(1).toLong, (cols(2).toLong, format.parse(cols(3)))) })
こちらでは、RDD[Edge[( (Long, java.util.Date) )] ] と宣言しています。これは辺情報として、(Long, java.util.Date)のタプル型の値を持つということです。この宣言に従って、CSVから読み込んだ値をセットしています。
あとは、このふたつを合わせてグラフデータとして生成するだけです。
val graph:Graph[(String, Long), (Long, java.util.Date)] = Graph(vertices, edges)
次回予告
明日は、このグラフデータの辺や頂点、そして、トリプレットの編集処理を見ていきたいと思います。
※ 今日説明したソースは、graphx-advent-samples/Day04.scala at master · ironpeace/graphx-advent-samples · GitHubをご参照ください。