如何将一个数据集的列(也包括多个列)中的值映射到其他数据集

How to map values in column(multiple columns also) of one dataset to other dataset

我在图框部分工作,我需要在 d3.js 中有 edges/links 才能在 Vertex/nodes 的索引值中作为源和目标。

现在我有 VertexDF 作为

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

EdgesDF

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

现在我需要将这个EdgesDF转换为如下

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

所有列值都应具有取自 VertexDF 的名称索引。我期待 Higher-order functions。 我的方法是将 VertexDF 转换为映射,然后迭代 EdgesDF 并替换每个出现的地方。

我试过的

制作了名称到 ID 的映射

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

您的 collect-ing 顶点和边数据帧的方法只有在它们很小的时候才有效。我建议 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|
// +----+---+