0

我正在处理图框部分,我需要在 d3.js 中有边/链接,以便在顶点/节点的索引值中作为源和目标。

现在我VertexDF

+--------------------+-----------+
|                  id|      rowID|
+--------------------+-----------+
|      Raashul Tandon|          3|
|         Helen Jones|          5|
----------------------------------

EdgesDF

+-------------------+--------------------+
|                src|                 dst|
+-------------------+--------------------+
|     Raashul Tandon|    Helen Jones     |
------------------------------------------

现在我需要将其转换EdgesDF如下

+-------------------+--------------------+
|                src|                 dst|
+-------------------+--------------------+
|     3             |            5       |
------------------------------------------

所有列值都应该具有取自VertexDF.I 的名称索引。我期待在Higher-order functions. 我的方法是转换VertexDF为地图,然后迭代EdgesDF并替换每一次出现。

我试过的

将名称映射到 ids

val Actmap = VertxDF.collect().map(f =>{
  val name = f.getString(0)
  val id = f.getLong(1)
  (name,id)
})
.toMap

用那张地图EdgesDF

EdgesDF.collect().map(f => {
  val src = f.getString(0)
  val dst = f.getString(0)

  val src_id = Actmap.get(src)
  val dst_id = Actmap.get(dst)
  (src_id,dst_id)
})

4

1 回答 1

0

collect的顶点和边缘数据帧的方法只有在它们很小的情况下才有效。我会建议left- 加入边缘和顶点数据框来获得你需要的东西:

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

val VertxDF = Seq(
  ("Raashul Tandon", 3),
  ("Helen Jones", 5),
  ("John Doe", 6),
  ("Rachel Smith", 7)
).toDF("id", "rowID")

val EdgesDF = Seq(
  ("Raashul Tandon", "Helen Jones"),
  ("Helen Jones", "John Doe"),
  ("Unknown", "Raashul Tandon"),
  ("John Doe", "Rachel Smith")
).toDF("src", "dst")

EdgesDF.as("e").
  join(VertxDF.as("v1"), $"e.src" === $"v1.id", "left_outer").
  join(VertxDF.as("v2"), $"e.dst" === $"v2.id", "left_outer").
  select($"v1.rowID".as("src"), $"v2.rowID".as("dst")).
  show
// +----+---+
// | src|dst|
// +----+---+
// |   3|  5|
// |   5|  6|
// |null|  3|
// |   6|  7|
// +----+---+
于 2019-03-25T17:04:19.990 回答