GraphStream是構(gòu)建在Spark GraphX之上的第三方圖可視化工具。它雖然不屬于Spark項目,但對GraphX的支持很好,而且和GraphFrame也能完美兼容。
網(wǎng)上基于GraphX構(gòu)建的可視化例子已經(jīng)很多了。
本文演示一下基于GraphFrame的可視化方法。
導(dǎo)入依賴:
<dependency>
<groupId>graphframes</groupId>
<artifactId>graphframes</artifactId>
<version>0.8.2-spark2.4-s_2.11</version>
</dependency>
<dependency>
<groupId>org.graphstream</groupId>
<artifactId>gs-core</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.graphstream</groupId>
<artifactId>gs-ui</artifactId>
<version>1.2</version>
</dependency>
代碼:
line5: stylesheet.css是用戶自定義的外部樣式,也可以不寫。
line9: v.get(1)代表頂點DataFrame的第二列,在圖中顯示它的屬性值。
line2: directed變量代表是否為有向圖。
//圖的可視化
def displayGraph(graphframe: GraphFrame, directed: Boolean): Unit = {
val graphStream: SingleGraph = new SingleGraph("GraphStream")
graphStream.addAttribute("ui.stylesheet", "url(file:src/main/resources/stylesheet.css)")
// 加載頂點到可視化圖對象中
graphframe.vertices.collect().foreach { v =>
val node = graphStream.addNode(v.getAs(“id”).toString).asInstanceOf[SingleNode]
node.setAttribute("ui.label", v.get(1).toString)
}
//加載邊到可視化圖對象中
var id: Int = 0
graphframe.edges.collect().foreach { e =>
id += 1
val edge = graphStream.addEdge(id.toString,
e.getAs("src").toString, e.getAs("dst").toString, directed)
.asInstanceOf[AbstractEdge]
edge.addAttribute("ui.label", e.getAs("attr").toString)
}
//顯示
graphStream.display()
}
效果:

圖可視化.png
附:css樣式文件
node {
fill-color: #a1d99b;
size: 30px;
text-size: 15;
text-alignment: at-right;
text-padding: 2;
text-background-color: #fff7bc;
}
edge {
shape: cubic-curve;
fill-color: #dd1c77;
z-index: 0;
text-background-mode: rounded-box;
text-background-color: #fff7bc;
text-alignment: above;
text-padding: 2;
}