GraphStream是构建在Spark GraphX之上的第三方图可视化工具。它虽然不属于Spark项目,但对GraphX的支持很好,而且和GraphFrame也能完美兼容。
网上基于GraphX构建的可视化例子已经很多了。
本文演示一下基于GraphFrame的可视化方法。
导入依赖:
<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;
}