2016-08-03 59 views
5

我正在尋找一種方法來可視化在Spark的Graphx中構建的圖形。就我所知,Graphx沒有任何可視化方法,所以我需要將Graphx中的數據導出到另一個圖形庫,但是我被卡在了這裏。我跑到這個網站:https://lintool.github.io/warcbase-docs/Spark-Network-Analysis/ 但它沒有幫助。我應該使用哪個庫以及如何導出圖。Graphx可視化

+0

你需要從圖的頂點和邊轉換成你所需要的格式。這是一個將DataFrame轉換爲Higcharts格式的回購。 https://github.com/knockdata/zeppelin-highcharts –

+0

另一種選擇是將圖表保存爲'GEXF'格式,並將它們加載到'Gephi'(https://gephi.org/)可視化系統中。不幸的是,GraphX本身不支持該格式,但您可以嘗試自行實施。 –

回答

6

所以,你可以從Manning | Spark GraphX in Action

def toGexf[VD,ED](g:Graph[VD,ED]) : String = { 
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
    "<gexf xmlns=\"http://www.gexf.net/1.2draft\" version=\"1.2\">\n" + 
    " <graph mode=\"static\" defaultedgetype=\"directed\">\n" + 
    " <nodes>\n" + 
    g.vertices.map(v => "  <node id=\"" + v._1 + "\" label=\"" + 
         v._2 + "\" />\n").collect.mkString + 
    " </nodes>\n" + 
    " <edges>\n" + 
    g.edges.map(e => "  <edge source=\"" + e.srcId + 
        "\" target=\"" + e.dstId + "\" label=\"" + e.attr + 
        "\" />\n").collect.mkString + 
    " </edges>\n" + 
    " </graph>\n" + 
    "</gexf>" 
} 
做這樣的事情

  1. 保存到gexf(圖形交換格式)的代碼,
  2. 使用linkurious.js中的GEXF插件來加載文件

實施例:http://gregroberts.github.io

enter image description here

1

則可以使用Gephi或從zeppelind3。檢查D3.js In Action by Elijah MeeksSpark GraphX in Action by Michael S. Malak

給它一個去下面從飛艇中scalajsgrapxInAction借:

import org.apache.spark.graphx._ 
import scala.reflect.ClassTag 

def drawGraph[VD:ClassTag,ED:ClassTag](g:Graph[VD,ED]) = { 

val u = java.util.UUID.randomUUID 
val v = g.vertices.collect.map(_._1) 
println("""%html 
<div id='a""" + u + """' style='width:960px; height:500px'></div> 
<style> 
.node circle { fill: gray; } 
.node text { font: 10px sans-serif; 
    text-anchor: middle; 
    fill: white; } 
line.link { stroke: gray; 
    stroke-width: 1.5px; } 
</style> 
<script src="//d3js.org/d3.v3.min.js"></script> 
<script> 
.var width = 960, height = 500; 
var svg = d3.select("#a""" + u + """").append("svg") 
.attr("width", width).attr("height", height); 
var nodes = [""" + v.map("{id:" + _ + "}").mkString(",") + """]; 
var links = [""" + g.edges.collect.map(
e => "{source:nodes[" + v.indexWhere(_ == e.srcId) + 
"],target:nodes[" + 
v.indexWhere(_ == e.dstId) + "]}").mkString(",") + """]; 
var link = svg.selectAll(".link").data(links); 
link.enter().insert("line", ".node").attr("class", "link"); 
var node = svg.selectAll(".node").data(nodes); 
var nodeEnter = node.enter().append("g").attr("class", "node") 
nodeEnter.append("circle").attr("r", 8); 
nodeEnter.append("text").attr("dy", "0.35em") 
.text(function(d) { return d.id; }); 
d3.layout.force().linkDistance(50).charge(-200).chargeDistance(300) 
.friction(0.95).linkStrength(0.5).size([width, height]) 
.on("tick", function() { 
link.attr("x1", function(d) { return d.source.x; }) 
    .attr("y1", function(d) { return d.source.y; }) 
    .attr("x2", function(d) { return d.target.x; }) 
    .attr("y2", function(d) { return d.target.y; }); 
node.attr("transform", function(d) { 
return "translate(" + d.x + "," + d.y + ")"; 
}); 
}).nodes(nodes).links(links).start(); 
</script> 
""") 
}