Как отобразить значения в столбце (также в нескольких столбцах) одного набора данных в другой набор данных - PullRequest
0 голосов
/ 25 марта 2019

Я просыпаюсь в части графических фреймов, где мне нужно иметь ребра / ссылки в d3.js, чтобы они были в индексированных значениях вершин / узлов в качестве источника и места назначения.

Теперь у меня есть 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 и заменить каждый раз.

Что я уже пробовал

сделал карту имени для идентификаторов

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

1 Ответ

0 голосов
/ 25 марта 2019

Ваш подход к 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|
// +----+---+
...