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