SlideShare a Scribd company logo
1 of 33
Download to read offline
/ 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

More Related Content

What's hot

A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)Hadoop / Spark Conference Japan
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_publicKazuaki Ishizaki
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_TokyoKohei KaiGai
 
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5Koichiro Sasaki
 
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群Yu Ishikawa
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう幹雄 小川
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?Yohei Azekatsu
 
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...Holden Karau
 
Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...
Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...
Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...MapR Technologies Japan
 
Learning spaerk chapter03
Learning spaerk chapter03Learning spaerk chapter03
Learning spaerk chapter03Akimitsu Takagi
 
データサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリデータサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリSatoshi Kitajima
 
2019.03.19 Deep Dive into Spark SQL with Advanced Performance Tuning
2019.03.19 Deep Dive into Spark SQL with Advanced Performance Tuning2019.03.19 Deep Dive into Spark SQL with Advanced Performance Tuning
2019.03.19 Deep Dive into Spark SQL with Advanced Performance TuningTakuya UESHIN
 
A Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on TezA Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on TezGw Liu
 
2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016
2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 20162016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016
2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016Yu Ishikawa
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_FdwKohei KaiGai
 
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_publicKazuaki Ishizaki
 

What's hot (20)

A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
 
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5
 
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?
 
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法  ※講演は翻訳資料にて行います。 - Getting the Best...
PySparkによるジョブを、より速く、よりスケーラブルに実行するための最善の方法 ※講演は翻訳資料にて行います。 - Getting the Best...
 
KMLとR言語
KMLとR言語KMLとR言語
KMLとR言語
 
MapReduce入門
MapReduce入門MapReduce入門
MapReduce入門
 
Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...
Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...
Apache Drill: Rethinking SQL for Big data – Don’t Compromise on Flexibility o...
 
Learning spaerk chapter03
Learning spaerk chapter03Learning spaerk chapter03
Learning spaerk chapter03
 
データサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリデータサイエンティスト必見!M-1グランプリ
データサイエンティスト必見!M-1グランプリ
 
2019.03.19 Deep Dive into Spark SQL with Advanced Performance Tuning
2019.03.19 Deep Dive into Spark SQL with Advanced Performance Tuning2019.03.19 Deep Dive into Spark SQL with Advanced Performance Tuning
2019.03.19 Deep Dive into Spark SQL with Advanced Performance Tuning
 
A Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on TezA Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on Tez
 
Inside of Asakusa DSL
Inside of Asakusa DSLInside of Asakusa DSL
Inside of Asakusa DSL
 
2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016
2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 20162016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016
2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw
 
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public
 

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

Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Kazuaki Ishizaki
 
Asakusa FrameworkとScalaの密かな関係
Asakusa FrameworkとScalaの密かな関係Asakusa FrameworkとScalaの密かな関係
Asakusa FrameworkとScalaの密かな関係hishidama
 
R入門とgoogle map +α
R入門とgoogle map +αR入門とgoogle map +α
R入門とgoogle map +αkobexr
 
Map server入門 - FOSS4G 2012 Hokkaido
Map server入門 - FOSS4G 2012 HokkaidoMap server入門 - FOSS4G 2012 Hokkaido
Map server入門 - FOSS4G 2012 HokkaidoHideo Harada
 
Data processing at spotify using scio
Data processing at spotify using scioData processing at spotify using scio
Data processing at spotify using scioJulien Tournay
 
msgraph: Terraform provider for Microsoft Graph
msgraph: Terraform provider for Microsoft Graphmsgraph: Terraform provider for Microsoft Graph
msgraph: Terraform provider for Microsoft Graphyaegashi
 
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点hishidama
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with PythonAtsushi Hayakawa
 
Android + Runtime Environment
Android + Runtime EnvironmentAndroid + Runtime Environment
Android + Runtime Environment三七男 山本
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.jsYoshiiro Ueno
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門Yuki Morishita
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するTakahito Tejima
 
東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29西岡 賢一郎
 
RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッションarctic_tern265
 
GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014
GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014
GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014鉄平 土佐
 
Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析npsg
 

Similar to Sparkで始めるお手軽グラフデータ分析 (20)

Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Introduction new features in Spark 3.0
Introduction new features in Spark 3.0
 
Asakusa FrameworkとScalaの密かな関係
Asakusa FrameworkとScalaの密かな関係Asakusa FrameworkとScalaの密かな関係
Asakusa FrameworkとScalaの密かな関係
 
R入門とgoogle map +α
R入門とgoogle map +αR入門とgoogle map +α
R入門とgoogle map +α
 
Map server入門 - FOSS4G 2012 Hokkaido
Map server入門 - FOSS4G 2012 HokkaidoMap server入門 - FOSS4G 2012 Hokkaido
Map server入門 - FOSS4G 2012 Hokkaido
 
Data processing at spotify using scio
Data processing at spotify using scioData processing at spotify using scio
Data processing at spotify using scio
 
msgraph: Terraform provider for Microsoft Graph
msgraph: Terraform provider for Microsoft Graphmsgraph: Terraform provider for Microsoft Graph
msgraph: Terraform provider for Microsoft Graph
 
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with Python
 
Android + Runtime Environment
Android + Runtime EnvironmentAndroid + Runtime Environment
Android + Runtime Environment
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
 
Rを用いたGIS
Rを用いたGISRを用いたGIS
Rを用いたGIS
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29
 
RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッション
 
GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014
GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014
GraphXはScalaエンジニアにとってのブルーオーシャン @ Scala Matsuri 2014
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析Apache Spark+Zeppelinでアドホックなネットワーク解析
Apache Spark+Zeppelinでアドホックなネットワーク解析
 

More from Nagato Kasaki

20190712 polkadot japan meetup
20190712 polkadot japan meetup20190712 polkadot japan meetup
20190712 polkadot japan meetupNagato Kasaki
 
Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Nagato Kasaki
 
暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXroute暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXrouteNagato Kasaki
 
ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!Nagato Kasaki
 
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化Nagato Kasaki
 
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Nagato Kasaki
 

More from Nagato Kasaki (6)

20190712 polkadot japan meetup
20190712 polkadot japan meetup20190712 polkadot japan meetup
20190712 polkadot japan meetup
 
Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発
 
暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXroute暗号通貨輪読会 #20 bloXroute
暗号通貨輪読会 #20 bloXroute
 
ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!
 
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
Sparkを活用したレコメンドエンジンのパフォーマンスチューニング&自動化
 
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
 

Recently uploaded

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 

Recently uploaded (11)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

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

  • 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