基于DataFrame的圖處理庫GraphFrames
大小:0.3 MB 人氣: 2017-10-11 需要積分:1
GraphFrames
與Apache Spark的GraphX類似,GraphFrames支持多種圖處理功能,但得益于DataFrame因此GraphFrames與GraphX庫相它有著下面幾方面的優勢:
統一的 API: 為Python、Java和Scala三種語言提供了統一的接口,這是Python和Java首次能夠使用GraphX的全部算法。強大的查詢功能:GraphFrames使得用戶可以構建與Spark SQL以及DataFrame類似的查詢語句。圖的存儲和讀取:GraphFrames與DataFrame的數據源完全兼容,支持以Parquet、JSON以及CSV等格式完成圖的存儲或讀取。
在GraphFrames中圖的頂點(Vertex)和邊(edge)都是以DataFrame形式存儲的,所以一個圖的所有信息都能夠完整保存。
示例
比如說我們現在有一個社交關系圖,每一名用戶也就是頂點由他們之間的關系所連接,比如下面的這個例子:

針對這種社交關系圖我們可能會有“誰最有影響力”或“應不應該介紹甲乙之間認識”等問題,這類問題可以用圖查詢算法來解決。這里每一名用戶有姓名和年齡兩種屬性,用戶之間的關系也有不同的類型。


簡單查詢
使用GraphFrames來進行查詢非常容易。由于頂點和邊都是以DataFrame存儲,很多簡單一些的查詢語句直接就是DataFrame/SQL語句。
問:圖中年齡超過35的用戶總數是多少?
g.vertices.filter(“age》35”)
問:有兩名以上關注者的用戶總數是多少?
g.inDegrees.filter(“inDegree》=2”)
復雜查詢
GraphFrames兼容GraphX中所有的算法因此對于復雜查詢也能夠很好地支持。比如我們想找出圖中最重要的用戶就可以用pageRank函數:
results = g.pageRank(resetProbability=0.15, maxIter=10) display(results.vertices)
GraphFrames還加入了廣度優先搜索BFS和模式發現Motif finding兩種新算法。
再舉一個例子,比如我們想給用戶推薦關注 的人就可以尋找圖中滿足下面這個條件的ABC三個用戶:A關注B,B關注C但A并未關注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支持的算法還有:排序、最短路徑、連通分量、強連通分量、三角計數和標簽傳播LPA。
GraphFrames與GraphX的集成
GraphFrames可以實現與GraphX的完美集成。兩者之間相互轉換時不會丟失任何數據。
val gx: Graph[Row, Row] = g.toGraphX() val g2: GraphFrame = GraphFrame.fromGraphX(gx)
欲了解更多GraphFrames和GraphX之間的轉換請參閱GraphFrames API文檔。
小結
DataFrames針對圖所做出的優化還遠未完成,我們在下一版本中還會加入更多的功能。
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%