基于DataFrame的圖處理庫(kù)GraphFrames
大小:0.3 MB 人氣: 2017-10-11 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
標(biāo)簽:graphframes(1688)
? 近日,Databricks和UC Berkeley及MIT一起為Apache Spark設(shè)計(jì)了一個(gè)圖處理庫(kù)——GraphFrames。它既能利用DataFrame良好的擴(kuò)展性和強(qiáng)大的性能,同時(shí)也為Scala、Java和Python提供了統(tǒng)一的圖處理API。GraphFrames
與Apache Spark的GraphX類似,GraphFrames支持多種圖處理功能,但得益于DataFrame因此GraphFrames與GraphX庫(kù)相它有著下面幾方面的優(yōu)勢(shì):
統(tǒng)一的 API: 為Python、Java和Scala三種語(yǔ)言提供了統(tǒng)一的接口,這是Python和Java首次能夠使用GraphX的全部算法。強(qiáng)大的查詢功能:GraphFrames使得用戶可以構(gòu)建與Spark SQL以及DataFrame類似的查詢語(yǔ)句。圖的存儲(chǔ)和讀?。篏raphFrames與DataFrame的數(shù)據(jù)源完全兼容,支持以Parquet、JSON以及CSV等格式完成圖的存儲(chǔ)或讀取。
在GraphFrames中圖的頂點(diǎn)(Vertex)和邊(edge)都是以DataFrame形式存儲(chǔ)的,所以一個(gè)圖的所有信息都能夠完整保存。
示例
比如說(shuō)我們現(xiàn)在有一個(gè)社交關(guān)系圖,每一名用戶也就是頂點(diǎn)由他們之間的關(guān)系所連接,比如下面的這個(gè)例子:
針對(duì)這種社交關(guān)系圖我們可能會(huì)有“誰(shuí)最有影響力”或“應(yīng)不應(yīng)該介紹甲乙之間認(rèn)識(shí)”等問(wèn)題,這類問(wèn)題可以用圖查詢算法來(lái)解決。這里每一名用戶有姓名和年齡兩種屬性,用戶之間的關(guān)系也有不同的類型。
簡(jiǎn)單查詢
使用GraphFrames來(lái)進(jìn)行查詢非常容易。由于頂點(diǎn)和邊都是以DataFrame存儲(chǔ),很多簡(jiǎn)單一些的查詢語(yǔ)句直接就是DataFrame/SQL語(yǔ)句。
問(wèn):圖中年齡超過(guò)35的用戶總數(shù)是多少?
g.vertices.filter(“age》35”)
問(wèn):有兩名以上關(guān)注者的用戶總數(shù)是多少?
g.inDegrees.filter(“inDegree》=2”)
復(fù)雜查詢
GraphFrames兼容GraphX中所有的算法因此對(duì)于復(fù)雜查詢也能夠很好地支持。比如我們想找出圖中最重要的用戶就可以用pageRank函數(shù):
results = g.pageRank(resetProbability=0.15, maxIter=10) display(results.vertices)
GraphFrames還加入了廣度優(yōu)先搜索BFS和模式發(fā)現(xiàn)Motif finding兩種新算法。
再舉一個(gè)例子,比如我們想給用戶推薦關(guān)注 的人就可以尋找圖中滿足下面這個(gè)條件的ABC三個(gè)用戶:A關(guān)注B,B關(guān)注C但A并未關(guān)注C。代碼如下:
# Motif: A-》B-》C but notA-》C results = g.find(“(A)-[]-》(B); (B)-[]-》(C); ?。ˋ)-[]-》(C)”) # Filterout loops (withDataFrame operation) results = results.filter(“A.id != C.id”) # Selectrecommendations forA tofollow C results = results.select(“A”, “C”) display(results)
其他GraphFrames支持的算法還有:排序、最短路徑、連通分量、強(qiáng)連通分量、三角計(jì)數(shù)和標(biāo)簽傳播LPA。
GraphFrames與GraphX的集成
GraphFrames可以實(shí)現(xiàn)與GraphX的完美集成。兩者之間相互轉(zhuǎn)換時(shí)不會(huì)丟失任何數(shù)據(jù)。
val gx: Graph[Row, Row] = g.toGraphX() val g2: GraphFrame = GraphFrame.fromGraphX(gx)
欲了解更多GraphFrames和GraphX之間的轉(zhuǎn)換請(qǐng)參閱GraphFrames API文檔。
小結(jié)
DataFrames針對(duì)圖所做出的優(yōu)化還遠(yuǎn)未完成,我們?cè)谙乱话姹局羞€會(huì)加入更多的功能。
?
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%