Graphx可视化

10

我正在寻找一种可视化Spark Graphx中构建的图形的方法。据我所知,Graphx没有任何可视化方法,因此我需要将数据从Graphx导出到另一个图形库,但我卡在这里了。我看到了这个网站:https://lintool.github.io/warcbase-docs/Spark-Network-Analysis/,但是它没有帮助我。我应该使用哪个库以及如何导出图形。


你需要将图的顶点和边转换为所需的格式。这是一个将DataFrame转换为Higcharts格式的存储库。https://github.com/knockdata/zeppelin-highcharts - Rockie Yang
1
另一种选择是将您的图形保存为GEXF格式,并将其加载到Gephi(https://gephi.org/)可视化系统中。不幸的是,GraphX本身不支持该格式,但您可以尝试自己实现它。 - Paweł Jurczenko
4个回答

14

那么你可以像这样做:

  1. 保存来自Manning | Spark GraphX in Action的代码到gexf(图形交换格式)中。
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>"
}
  • 使用linkurious.js中的GEXF插件加载文件
  • 示例:http://gregroberts.github.io

    enter image description here


    3
    你可以使用Gephizeppelin中的d3。查看Elijah Meeks的D3.js In Action和Michael S. Malak的Spark GraphX in Action,以了解更多信息。

    以下是从grapxInAction中借鉴的scalajs代码示例:

    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>
     """)
     }
    

    3
    如果您正在使用GraphFrames,那么我修改了@Karol Sudol在他的GraphFrames回答中提供的代码:
        def drawGraph[vertices:ClassTag,relations:ClassTag](g:GraphFrame) = {
    
        val u = java.util.UUID.randomUUID
        val v = g.vertices.select("id")
    
    
        val vertexes: Array[String] = g.vertices.select("id").rdd.map(x => x(0).toString).collect()
    
        val edges: Array[Array[String]] = g.edges.select("src", "dst").rdd.map(r => Array(r(0).toString, r(1).toString)).collect()
    
        val edgeCreation = edges.map{ edgeArray =>
       "{source:nodes["+ vertexes.indexOf(edgeArray(0).trim()) +"],target:nodes["+ vertexes.indexOf(edgeArray(1).trim())+"]}"
      }
    
    
      println("""
        <!DOCTYPE html>
         <html lang="en">
         <head>
         <meta charset="utf-8">
         <title>Graph</title>
         <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="https://d3js.org/d3.v3.min.js"></script>
        </head>
        <body>
        <script>
        var width = 960, height = 500;
        var svg = d3.select("#a""" + u + """").append("svg")
        .attr("width", width).attr("height", height);
        var nodes = [""" + vertexes.map("{id:\"" + _ + "\"}").mkString(",") + """];
        var links = ["""+ edgeCreation.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>
        </body>
        </html>
         """)
    
    }
    

    0

    您可以使用 echarts,这是一款简单的工具,用于可视化您的图表。链接:百度 echarts

    本网站中的演示

    您只能从远程 URL 获取 JSON 数据,并将其可视化。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接