Как визуализировать граф с сетью в Zeppelin? - PullRequest
0 голосов
/ 03 мая 2020

Я хочу визуализировать мой график с% network в zeppelin. Я определил узлы и ребра, прочитав файл JSON.

val nodes = spark.read.option("multiline","true").json("/opt/nodes.json")
val edges = spark.read.option("multiLine","true").json("/opt/edges.json")
val graph = GraphFrame(nods,edges)

Я прочитал документацию , но она не подходит для файла. Я не знаю, как мне это представить.

1 Ответ

0 голосов
/ 03 мая 2020

Следующий код, хотя и не очень обобщенный c теоретически визуализирует данные из объекта GraphFrame (не используйте его на гигантском графике). Но хотя он генерирует правильные данные, которые видны в пользовательском интерфейсе, во время визуализации возникает ошибка JavaScript (я пробовал 0.9.0-preview1) - я создал ZEPPELIN-4793 для его обработки .

import org.graphframes._
import org.apache.spark.sql.functions._

  def graphframeToNetworkText(g: GraphFrame, vertexLabel: String, edgeLabel: String): String = {
    val v = g.vertices
    val vDataFields = v.schema.fields.map{_.name}.filterNot(_ == "id").map(col(_))
    val vJson = v.select(col("id"), lit(vertexLabel).as("label"),
      struct(vDataFields: _*).as("data"))
      .toJSON.collect.mkString("[",", ","]")
    val e = g.edges
    val eDataFields = e.schema.fields.map{_.name}
      .filterNot(x => x == "src" || x == "dst").map(col(_))
    val timeUUID = udf(() => java.util.UUID.randomUUID().toString)
    val eJson = e.select(col("src").as("source"),
      col("dst").as("target"),
      lit(edgeLabel).as("label"),
      struct(eDataFields: _*).as("data"))
      .withColumn("id", timeUUID())
      .toJSON.collect.mkString("[",", ","]")

    val sb = new StringBuilder
    sb.append("%network {")
      .append("\n\"nodes\": ")
      .append(vJson)
      .append(",\n\"edges\": ")
      .append(eJson)
      .append(",\n\"directed\": false,\n\"types\":[\"")
      .append(edgeLabel)
      .append("\"],\n\"labels\":{\"")
      .append(vertexLabel)
      .append("\": \"#3071A9\"}\n}")

    sb.toString()
  }

, который можно назвать следующим образом:

val g: GraphFrame = examples.Graphs.friends
print(graphframeToNetworkText(g, "person", "rel"))
...