/ 33
Sparkで始める
お手軽グラフデータ分析
ビッグデータ部 加嵜長門
2016年5月11日
『詳解Apache Spark』出版記念
/ 33
自己紹介
• 加嵜 長門
• 2014年4月~ DMM.comラボ
• Hadoop基盤構築
• Spark MLlib, GraphXを用いたレコメンド開発
• 『詳解 Apache Spark』では「8章 GraphX」を執筆
2
/ 33
Spark GraphX 周りの話題
• Hadoop/Spark Conference Japan 2016
• 2016年2月8日
• キーノートでのアンケート結果
• GraphX…
3
Spark Conference Japan 開催にあたって(Hadoop / Spark Conference Japan 2016 キーノート講演資料)
http://www.slideshare.net/hadoopconf/spark-conference-japan2016-keynote-saruta
/ 33
Spark GraphX 周りの話題
• GraphFramesの登場
• Databricksが2016年3月3日にリリース
• http://graphframes.github.io/
• Spark GraphX と DataFrames (SparkSQL) の統合
• 利用数の多いDataFramesを用いて、手軽にグラフデータが扱える
• 事例も増えそう・・・?
4
/ 33
そもそもグラフデータとは
• “つながり”を表現するデータ構造
• cf. ER図
5
entity entityrelation
node/vertex
relation/edge
attribute
attribute
/ 33
グラフデータの具体例
• ソーシャルグラフ
• 人と人とのつながり
6
ASSIOMA:オルタナティブ・ブログ:
「あの人検索スパイシー」の「相関図」
http://blogs.itmedia.co.jp/assioma/2010/08/kdditwitter-689.html
/ 33
グラフデータの具体例
• 路線図
• 地図グラフ
• 駅と駅のつながり(路線)
7
goo地図 - 首都圏JRの路線図
http://map.goo.ne.jp/station/map/tokyo_jr/
/ 33
グラフデータの具体例
• インターネット
• Webグラフ
• ページとページのリンク
8
HOME
Contents
Purchase
Contact
/ 33
グラフデータの具体例
• 家系図
• 親子のつながり
9
家系図作成本舗 -織田信長の家系図
http://www.e-keizu.com/kakeizu/nobunaga.html
/ 33
グラフ以外のデータ構造
• 配列
• ベクトル、行列
• 連想配列
• オブジェクト
• リスト
• 関係(リレーション)
• etc…
10
1 2 3
4 5 6
7 8 9
{
a1: v1
a2: v2
}
A B C
/ 33
それぞれのデータ構造を用いたモデリング
• 友人関係の表現方法
• 無数にある
11
A
B
C
A B C
A 0 1 1
B 0 0 1
C 0 0 0
A B C
グラフ構造 隣接行列
/ 33
よくある質問
• 「それってグラフじゃないとできないの?」
→ 多くの場合は他の選択肢もある
• RDB、行列、etc.
• さまざまなデータ構造や分析手法を活用して、多角的な視点を
持つことが重要
12
/ 33
グラフの活用例
• レコメンド
• 趣味が合うユーザとの
つながり
• 関心のある商品との
つながり
13
技術評論社: Hadoopでレコメンドシステムを作ろう
http://gihyo.jp/dev/serial/01/recommend_hadoop/0001
/ 33
グラフの活用例
• マーケティング
• ネットワークビジネス
• バイラルマーケティング
• インフルエンサーマーケティング
• 口コミを使ったマーケティング
• 影響力の強いユーザの抽出
• クラスター分析
14
マーケティング用語集 - インフルエンサー・マーケティングとは
http://www.spi-consultants.com/ja/terms/archives/influence-marketing.php
/ 33
グラフの活用例
• 不正検知
• 偽装保険金詐取
• 運転手
• 乗客
• 弁護士
• 医者
15
Linkurious - Whiplash for cash : using graphs for fraud detection
https://linkurio.us/whiplash-for-cash-using-graphs-for-fraud-detection/
/ 33
グラフの活用例
• 不正検知
• 偽装保険金詐取
• 少人数で何度も事故に
巻き込まれている
ケースを抽出
16
Linkurious - Whiplash for cash : using graphs for fraud detection
https://linkurio.us/whiplash-for-cash-using-graphs-for-fraud-detection/
/ 33
グラフの活用例
• 不正検知
• クレジットカード詐欺
• 少数の人数で、住所や
電話番号を使い回している
ケースを抽出
17
Improving First-Party Bank Fraud Detection with Graph Databases
http://neo4j.com/blog/first-party-bank-fraud-detection-graph-databases/
/ 33
グラフの活用例
• 「パナマ文書」解析
• 多くの会社(ペーパーカンパニーを含む)を流れるお金の流れを分析
18
Medium - 「パナマ文書」解析の技術的側面
https://medium.com/@c_z/パナマ文書-解析の技術的側面-d10201bbe195#.nvxvolgn8
/ 33
グラフ処理系プロダクト
• グラフDB
• グラフデータを構造化
• グラフに対してクエリを投げる
• 例) Neo4j, Titan
• グラフ処理
• グラフ処理の流れを記述
• 処理系に対してグラフデータを投げる
• 例) Spark GraphX, GraphLab
19
グラフデータ
グラフ処理
クエリ クエリ クエリ
グラフ グラフ グラフ
/ 33
Spark GraphXのメリット
• vs. グラフDB
• 分散処理による高スループット
• 耐障害性
• vs. 他のグラフ処理系
• グラフに特化しない汎用的なデータ構造
• 表形式やベクトルとシームレスに結合できる
20
https://amplab.github.io/graphx/
/ 33
Spark GraphX – グラフの作成
• RDDから作成
• Generatorで自動生成
21
scala> val graph = Graph(nodes, relations)
scala> GraphGenerators.logNormalGraph(sc, numVertices = 5, mu = 4.0, sigma = 1.3)
scala> GraphGenerators.rmatGraph(sc, requestedNumVertices = 10, numEdges = 10)
/ 33
Spark GraphX – グラフ分析
• グラフの特徴量を取得
22
// 位数(頂点の数)を取得
scala> graph.numVertices
res0: Long = 3
// サイズ(辺の数)を取得
scala> graph.numEdges
res1: Long = 3
// 各頂点の次数(接する辺の数)を取得
scala> graph.degrees.collect.foreach(println(_))
(2,2)
(1,2)
(3,2)
/ 33
GraphFrames – グラフの作成
23
// graphframesパッケージのインポート
scala> import org.graphframes._
import org.graphframes._
// Vertex(頂点)となるDataFrameを作成
scala> val v = sqlContext.createDataFrame(List(
| (0L, "user", "u1"),
| (1L, "user", "u2"),
| (2L, "item", "i1"),
| (3L, "item", "i2"),
| (4L, "item", "i3"),
| (5L, "item", "i4")
| )).toDF("id", "type", "name")
v: org.apache.spark.sql.DataFrame = [id: bigint, type: string, name: string]
u1
u2
ユーザ
i1
i2
i3
i4
アイテム
/ 33
GraphFrames – グラフの作成
24
// Edge(辺)となるDataFrameを作成
scala> val e = sqlContext.createDataFrame(List(
| (0L, 2L, "purchase"),
| (0L, 3L, "purchase"),
| (0L, 4L, "purchase"),
| (1L, 3L, "purchase"),
| (1L, 4L, "purchase"),
| (1L, 5L, "purchase")
| )).toDF("src", "dst", "type")
e: org.apache.spark.sql.DataFrame = [src: bigint, dst: bigint, type: string]
// GraphFrameを作成
scala> val g = GraphFrame(v, e)
g: org.graphframes.GraphFrame = GraphFrame(v:[id: bigint, attr: string, gender: string],
e:[src: bigint, dst: bigint, relationship: string])
u1
u2
i1
i2
i3
i4
購入ログ
/ 33
GraphFrames – アイテムレコメンドの実行例
25
// レコメンドアイテムの問い合わせ例
scala> g.find(
| " (a)-[]->(x); (b)-[]->(x);" +
| " (b)-[]->(y); !(a)-[]->(y)"
| ).groupBy(
| "a.name", "y.name"
| ).count().show()
+----+----+-----+
|name|name|count|
+----+----+-----+
| u1| i4| 2|
| u2| i1| 2|
+----+----+-----+
u1
u2
i1
i2
i3
i4
共通の商品を
購入したユーザ
まだ購入していないアイテムをレコメンド
(b)
(y)
(a)
(x)
/ 33
GraphFrames – サンプルグラフの利用 (1)
26
// スターグラフを作成
scala> val star = examples.Graphs.star(5)
// Tripletsを表示
scala> star.triplets.show()
+------------+----------+--------+
| edge| src| dst|
+------------+----------+--------+
|[1,0,edge-1]|[1,node-1]|[0,root]|
|[2,0,edge-2]|[2,node-2]|[0,root]|
|[3,0,edge-3]|[3,node-3]|[0,root]|
|[4,0,edge-4]|[4,node-4]|[0,root]|
|[5,0,edge-5]|[5,node-5]|[0,root]|
+------------+----------+--------+
0
1
2
3 4
5
node-1
node-2
node-3 node-4
node-5
root
edge-1
edge-2
edge-3 edge-4
edge-5
/ 33
GraphFrames – PageRankの実行例
27
// PageRankを計算
scala> val pr = g.pageRank.resetProbability(0.1).tol(0.01).run()
// PageRankのスコアを表示
scala> pr.vertices.show()
+---+-------+--------+
| id|v_attr1|pagerank|
+---+-------+--------+
| 0| root| 0.55|
| 1| node-1| 0.1|
| 2| node-2| 0.1|
| 3| node-3| 0.1|
| 4| node-4| 0.1|
| 5| node-5| 0.1|
+---+-------+--------+
0
1
2
3 4
5
0.1 0.1
0.1
0.1 0.1
0.55
/ 33
GraphFrames – サンプルグラフの利用 (2)
28
// 友達関係のサンプルグラフを作成
scala> val friends = examples.Graphs.friends
// Tripletsを表示
scala> friends.triplets.show()
+------------+--------------+--------------+
| edge| src| dst|
+------------+--------------+--------------+
|[a,b,friend]| [a,Alice,34]| [b,Bob,36]|
|[b,c,follow]| [b,Bob,36]|[c,Charlie,30]|
|[c,b,follow]|[c,Charlie,30]| [b,Bob,36]|
|[f,c,follow]| [f,Fanny,36]|[c,Charlie,30]|
|[e,f,follow]| [e,Esther,32]| [f,Fanny,36]|
|[e,d,friend]| [e,Esther,32]| [d,David,29]|
|[d,a,friend]| [d,David,29]| [a,Alice,34]|
|[a,e,friend]| [a,Alice,34]| [e,Esther,32]|
+------------+--------------+--------------+
a
b
c
de
f
g
Alice, 34
Bob, 36
Charlie, 30
Fanny, 36
Esther, 32 David, 29
Gabby, 60
friend
friend
friend
follow
follow
follow
friend
/ 33
a
GraphFrames – 最短距離を計算
29
// すべてのユーザからユーザ “a” までの最短距離を計算
scala> val d1 = friends.shortestPaths.landmarks(Seq("a")).run()
// 結果を表示
scala> d1.show()
+---+-------+---+-----------+
| id| name|age| distances|
+---+-------+---+-----------+
| f| Fanny| 36| Map()|
| g| Gabby| 60| Map()|
| a| Alice| 34|Map(a -> 0)|
| b| Bob| 36| Map()|
| c|Charlie| 30| Map()|
| d| David| 29|Map(a -> 1)|
| e| Esther| 32|Map(a -> 2)|
+---+-------+---+-----------+
a
b
c
de
f
a -> 0
g
a -> 2 a -> 1
/ 33
a
c
GraphFrames – 最短距離を計算
30
// すべてのユーザからユーザ “a”, “c” までの最短距離を計算
scala> val d2 = friends.shortestPaths.landmarks(Seq("a", "c")).run()
// 結果を表示
scala> d2.show()
+---+-------+---+-------------------+
| id| name|age| distances|
+---+-------+---+-------------------+
| f| Fanny| 36| Map(c -> 1)|
| g| Gabby| 60| Map()|
| a| Alice| 34|Map(a -> 0, c -> 2)|
| b| Bob| 36| Map(c -> 1)|
| c|Charlie| 30| Map(c -> 0)|
| d| David| 29|Map(a -> 1, c -> 3)|
| e| Esther| 32|Map(a -> 2, c -> 2)|
+---+-------+---+-------------------+
a
b
c
de
f
g
a -> 0
c -> 2
a -> 2
c -> 2
a -> 1
c -> 3
c -> 0
c -> 1
c -> 1
/ 33
a
b
c
d
GraphFrames – 最短経路の探索
31
// ユーザ “d”から“c” への最短経路を探索
scala> val path = friends.bfs.fromExpr("id = 'd'").toExpr("id = 'c'").run()
// 結果を表示
scala> path.show()
+------------+------------+------------+
| from| e0| v1|
+------------+------------+------------+
|[d,David,29]|[d,a,friend]|[a,Alice,34]|
+------------+------------+------------+
+------------+----------+------------+--------------+
| e1| v2| e2| to|
+------------+----------+------------+--------------+
|[a,b,friend]|[b,Bob,36]|[b,c,follow]|[c,Charlie,30]|
+------------+----------+------------+--------------+
a
b
c
de
f
g
Alice, 34
Bob, 36
Charlie, 30
David, 29
friend
follow
friend
/ 33
Spark GraphX – グラフ処理
• グラフアルゴリズムの適用
32
// triangeCountを取得
scala> val triangleCounts = graph.triangleCount
// クラスタ係数を計算
scala> val clusteringCoefficients =
| triangleCounts.mapVertices((id, count) =>
| count.toDouble
| ).joinVertices(degrees)((id, count, degree) => {
| degree match {
| case d if d > 1 => count * 2 / (d * (d - 1))
| case _ => 0.0
| }})
/ 33
Spark GraphX – グラフ処理
• 続きは・・・
33
http://gihyo.jp/book/2016/978-4-7741-8124-0

Sparkで始めるお手軽グラフデータ分析

  • 1.
  • 2.
    / 33 自己紹介 • 加嵜長門 • 2014年4月~ DMM.comラボ • Hadoop基盤構築 • Spark MLlib, GraphXを用いたレコメンド開発 • 『詳解 Apache Spark』では「8章 GraphX」を執筆 2
  • 3.
    / 33 Spark GraphX周りの話題 • Hadoop/Spark Conference Japan 2016 • 2016年2月8日 • キーノートでのアンケート結果 • GraphX… 3 Spark Conference Japan 開催にあたって(Hadoop / Spark Conference Japan 2016 キーノート講演資料) http://www.slideshare.net/hadoopconf/spark-conference-japan2016-keynote-saruta
  • 4.
    / 33 Spark GraphX周りの話題 • GraphFramesの登場 • Databricksが2016年3月3日にリリース • http://graphframes.github.io/ • Spark GraphX と DataFrames (SparkSQL) の統合 • 利用数の多いDataFramesを用いて、手軽にグラフデータが扱える • 事例も増えそう・・・? 4
  • 5.
    / 33 そもそもグラフデータとは • “つながり”を表現するデータ構造 •cf. ER図 5 entity entityrelation node/vertex relation/edge attribute attribute
  • 6.
    / 33 グラフデータの具体例 • ソーシャルグラフ •人と人とのつながり 6 ASSIOMA:オルタナティブ・ブログ: 「あの人検索スパイシー」の「相関図」 http://blogs.itmedia.co.jp/assioma/2010/08/kdditwitter-689.html
  • 7.
    / 33 グラフデータの具体例 • 路線図 •地図グラフ • 駅と駅のつながり(路線) 7 goo地図 - 首都圏JRの路線図 http://map.goo.ne.jp/station/map/tokyo_jr/
  • 8.
    / 33 グラフデータの具体例 • インターネット •Webグラフ • ページとページのリンク 8 HOME Contents Purchase Contact
  • 9.
    / 33 グラフデータの具体例 • 家系図 •親子のつながり 9 家系図作成本舗 -織田信長の家系図 http://www.e-keizu.com/kakeizu/nobunaga.html
  • 10.
    / 33 グラフ以外のデータ構造 • 配列 •ベクトル、行列 • 連想配列 • オブジェクト • リスト • 関係(リレーション) • etc… 10 1 2 3 4 5 6 7 8 9 { a1: v1 a2: v2 } A B C
  • 11.
    / 33 それぞれのデータ構造を用いたモデリング • 友人関係の表現方法 •無数にある 11 A B C A B C A 0 1 1 B 0 0 1 C 0 0 0 A B C グラフ構造 隣接行列
  • 12.
    / 33 よくある質問 • 「それってグラフじゃないとできないの?」 →多くの場合は他の選択肢もある • RDB、行列、etc. • さまざまなデータ構造や分析手法を活用して、多角的な視点を 持つことが重要 12
  • 13.
    / 33 グラフの活用例 • レコメンド •趣味が合うユーザとの つながり • 関心のある商品との つながり 13 技術評論社: Hadoopでレコメンドシステムを作ろう http://gihyo.jp/dev/serial/01/recommend_hadoop/0001
  • 14.
    / 33 グラフの活用例 • マーケティング •ネットワークビジネス • バイラルマーケティング • インフルエンサーマーケティング • 口コミを使ったマーケティング • 影響力の強いユーザの抽出 • クラスター分析 14 マーケティング用語集 - インフルエンサー・マーケティングとは http://www.spi-consultants.com/ja/terms/archives/influence-marketing.php
  • 15.
    / 33 グラフの活用例 • 不正検知 •偽装保険金詐取 • 運転手 • 乗客 • 弁護士 • 医者 15 Linkurious - Whiplash for cash : using graphs for fraud detection https://linkurio.us/whiplash-for-cash-using-graphs-for-fraud-detection/
  • 16.
    / 33 グラフの活用例 • 不正検知 •偽装保険金詐取 • 少人数で何度も事故に 巻き込まれている ケースを抽出 16 Linkurious - Whiplash for cash : using graphs for fraud detection https://linkurio.us/whiplash-for-cash-using-graphs-for-fraud-detection/
  • 17.
    / 33 グラフの活用例 • 不正検知 •クレジットカード詐欺 • 少数の人数で、住所や 電話番号を使い回している ケースを抽出 17 Improving First-Party Bank Fraud Detection with Graph Databases http://neo4j.com/blog/first-party-bank-fraud-detection-graph-databases/
  • 18.
    / 33 グラフの活用例 • 「パナマ文書」解析 •多くの会社(ペーパーカンパニーを含む)を流れるお金の流れを分析 18 Medium - 「パナマ文書」解析の技術的側面 https://medium.com/@c_z/パナマ文書-解析の技術的側面-d10201bbe195#.nvxvolgn8
  • 19.
    / 33 グラフ処理系プロダクト • グラフDB •グラフデータを構造化 • グラフに対してクエリを投げる • 例) Neo4j, Titan • グラフ処理 • グラフ処理の流れを記述 • 処理系に対してグラフデータを投げる • 例) Spark GraphX, GraphLab 19 グラフデータ グラフ処理 クエリ クエリ クエリ グラフ グラフ グラフ
  • 20.
    / 33 Spark GraphXのメリット •vs. グラフDB • 分散処理による高スループット • 耐障害性 • vs. 他のグラフ処理系 • グラフに特化しない汎用的なデータ構造 • 表形式やベクトルとシームレスに結合できる 20 https://amplab.github.io/graphx/
  • 21.
    / 33 Spark GraphX– グラフの作成 • RDDから作成 • Generatorで自動生成 21 scala> val graph = Graph(nodes, relations) scala> GraphGenerators.logNormalGraph(sc, numVertices = 5, mu = 4.0, sigma = 1.3) scala> GraphGenerators.rmatGraph(sc, requestedNumVertices = 10, numEdges = 10)
  • 22.
    / 33 Spark GraphX– グラフ分析 • グラフの特徴量を取得 22 // 位数(頂点の数)を取得 scala> graph.numVertices res0: Long = 3 // サイズ(辺の数)を取得 scala> graph.numEdges res1: Long = 3 // 各頂点の次数(接する辺の数)を取得 scala> graph.degrees.collect.foreach(println(_)) (2,2) (1,2) (3,2)
  • 23.
    / 33 GraphFrames –グラフの作成 23 // graphframesパッケージのインポート scala> import org.graphframes._ import org.graphframes._ // Vertex(頂点)となるDataFrameを作成 scala> val v = sqlContext.createDataFrame(List( | (0L, "user", "u1"), | (1L, "user", "u2"), | (2L, "item", "i1"), | (3L, "item", "i2"), | (4L, "item", "i3"), | (5L, "item", "i4") | )).toDF("id", "type", "name") v: org.apache.spark.sql.DataFrame = [id: bigint, type: string, name: string] u1 u2 ユーザ i1 i2 i3 i4 アイテム
  • 24.
    / 33 GraphFrames –グラフの作成 24 // Edge(辺)となるDataFrameを作成 scala> val e = sqlContext.createDataFrame(List( | (0L, 2L, "purchase"), | (0L, 3L, "purchase"), | (0L, 4L, "purchase"), | (1L, 3L, "purchase"), | (1L, 4L, "purchase"), | (1L, 5L, "purchase") | )).toDF("src", "dst", "type") e: org.apache.spark.sql.DataFrame = [src: bigint, dst: bigint, type: string] // GraphFrameを作成 scala> val g = GraphFrame(v, e) g: org.graphframes.GraphFrame = GraphFrame(v:[id: bigint, attr: string, gender: string], e:[src: bigint, dst: bigint, relationship: string]) u1 u2 i1 i2 i3 i4 購入ログ
  • 25.
    / 33 GraphFrames –アイテムレコメンドの実行例 25 // レコメンドアイテムの問い合わせ例 scala> g.find( | " (a)-[]->(x); (b)-[]->(x);" + | " (b)-[]->(y); !(a)-[]->(y)" | ).groupBy( | "a.name", "y.name" | ).count().show() +----+----+-----+ |name|name|count| +----+----+-----+ | u1| i4| 2| | u2| i1| 2| +----+----+-----+ u1 u2 i1 i2 i3 i4 共通の商品を 購入したユーザ まだ購入していないアイテムをレコメンド (b) (y) (a) (x)
  • 26.
    / 33 GraphFrames –サンプルグラフの利用 (1) 26 // スターグラフを作成 scala> val star = examples.Graphs.star(5) // Tripletsを表示 scala> star.triplets.show() +------------+----------+--------+ | edge| src| dst| +------------+----------+--------+ |[1,0,edge-1]|[1,node-1]|[0,root]| |[2,0,edge-2]|[2,node-2]|[0,root]| |[3,0,edge-3]|[3,node-3]|[0,root]| |[4,0,edge-4]|[4,node-4]|[0,root]| |[5,0,edge-5]|[5,node-5]|[0,root]| +------------+----------+--------+ 0 1 2 3 4 5 node-1 node-2 node-3 node-4 node-5 root edge-1 edge-2 edge-3 edge-4 edge-5
  • 27.
    / 33 GraphFrames –PageRankの実行例 27 // PageRankを計算 scala> val pr = g.pageRank.resetProbability(0.1).tol(0.01).run() // PageRankのスコアを表示 scala> pr.vertices.show() +---+-------+--------+ | id|v_attr1|pagerank| +---+-------+--------+ | 0| root| 0.55| | 1| node-1| 0.1| | 2| node-2| 0.1| | 3| node-3| 0.1| | 4| node-4| 0.1| | 5| node-5| 0.1| +---+-------+--------+ 0 1 2 3 4 5 0.1 0.1 0.1 0.1 0.1 0.55
  • 28.
    / 33 GraphFrames –サンプルグラフの利用 (2) 28 // 友達関係のサンプルグラフを作成 scala> val friends = examples.Graphs.friends // Tripletsを表示 scala> friends.triplets.show() +------------+--------------+--------------+ | edge| src| dst| +------------+--------------+--------------+ |[a,b,friend]| [a,Alice,34]| [b,Bob,36]| |[b,c,follow]| [b,Bob,36]|[c,Charlie,30]| |[c,b,follow]|[c,Charlie,30]| [b,Bob,36]| |[f,c,follow]| [f,Fanny,36]|[c,Charlie,30]| |[e,f,follow]| [e,Esther,32]| [f,Fanny,36]| |[e,d,friend]| [e,Esther,32]| [d,David,29]| |[d,a,friend]| [d,David,29]| [a,Alice,34]| |[a,e,friend]| [a,Alice,34]| [e,Esther,32]| +------------+--------------+--------------+ a b c de f g Alice, 34 Bob, 36 Charlie, 30 Fanny, 36 Esther, 32 David, 29 Gabby, 60 friend friend friend follow follow follow friend
  • 29.
    / 33 a GraphFrames –最短距離を計算 29 // すべてのユーザからユーザ “a” までの最短距離を計算 scala> val d1 = friends.shortestPaths.landmarks(Seq("a")).run() // 結果を表示 scala> d1.show() +---+-------+---+-----------+ | id| name|age| distances| +---+-------+---+-----------+ | f| Fanny| 36| Map()| | g| Gabby| 60| Map()| | a| Alice| 34|Map(a -> 0)| | b| Bob| 36| Map()| | c|Charlie| 30| Map()| | d| David| 29|Map(a -> 1)| | e| Esther| 32|Map(a -> 2)| +---+-------+---+-----------+ a b c de f a -> 0 g a -> 2 a -> 1
  • 30.
    / 33 a c GraphFrames –最短距離を計算 30 // すべてのユーザからユーザ “a”, “c” までの最短距離を計算 scala> val d2 = friends.shortestPaths.landmarks(Seq("a", "c")).run() // 結果を表示 scala> d2.show() +---+-------+---+-------------------+ | id| name|age| distances| +---+-------+---+-------------------+ | f| Fanny| 36| Map(c -> 1)| | g| Gabby| 60| Map()| | a| Alice| 34|Map(a -> 0, c -> 2)| | b| Bob| 36| Map(c -> 1)| | c|Charlie| 30| Map(c -> 0)| | d| David| 29|Map(a -> 1, c -> 3)| | e| Esther| 32|Map(a -> 2, c -> 2)| +---+-------+---+-------------------+ a b c de f g a -> 0 c -> 2 a -> 2 c -> 2 a -> 1 c -> 3 c -> 0 c -> 1 c -> 1
  • 31.
    / 33 a b c d GraphFrames –最短経路の探索 31 // ユーザ “d”から“c” への最短経路を探索 scala> val path = friends.bfs.fromExpr("id = 'd'").toExpr("id = 'c'").run() // 結果を表示 scala> path.show() +------------+------------+------------+ | from| e0| v1| +------------+------------+------------+ |[d,David,29]|[d,a,friend]|[a,Alice,34]| +------------+------------+------------+ +------------+----------+------------+--------------+ | e1| v2| e2| to| +------------+----------+------------+--------------+ |[a,b,friend]|[b,Bob,36]|[b,c,follow]|[c,Charlie,30]| +------------+----------+------------+--------------+ a b c de f g Alice, 34 Bob, 36 Charlie, 30 David, 29 friend follow friend
  • 32.
    / 33 Spark GraphX– グラフ処理 • グラフアルゴリズムの適用 32 // triangeCountを取得 scala> val triangleCounts = graph.triangleCount // クラスタ係数を計算 scala> val clusteringCoefficients = | triangleCounts.mapVertices((id, count) => | count.toDouble | ).joinVertices(degrees)((id, count, degree) => { | degree match { | case d if d > 1 => count * 2 / (d * (d - 1)) | case _ => 0.0 | }})
  • 33.
    / 33 Spark GraphX– グラフ処理 • 続きは・・・ 33 http://gihyo.jp/book/2016/978-4-7741-8124-0