Scala 如何在数据帧中编码值?

Scala 如何在数据帧中编码值?,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我有一个Spark(2.x)数据框,包含以下列: nodes_df.show() ------|------ node | group ------|------ AAA | 1 BBB | 1 CCC | 2 在节点上执行以下操作时,会添加行号 val nodes = nodes_df .withColumn("id",row_number().over(Window.orderBy("group"))) nodes.show() node | group -----

我有一个Spark(2.x)数据框,包含以下列:

nodes_df.show()

------|------
node  | group
------|------
AAA   | 1
BBB   | 1
CCC   | 2
节点上执行以下操作时,会添加行号

val nodes = nodes_df
  .withColumn("id",row_number().over(Window.orderBy("group")))
nodes.show()

node  | group
------|------
1     | 1
2     | 1
3     | 2
我有另一个数据帧,
arcs\u df

arcs_df.show()

node_from  | node_to | weight
-----------|---------|-------
AAA        | BBB     | 1
BBB        | CCC     | 1
我想知道,使用编码,如何将
节点中的相应节点编号分配给
节点u from
节点u to
列值
arcs\u df

我想得到一个如下所示的数据帧

final_df.show()

node_from  | node_to | weight
-----------|---------|-------
1          | 2       | 1
2          | 3       | 1

请注意,下面不使用编码,但它完全按照您希望的方式使用联接。让我们一起走过它

必要的进口

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
创建节点\u df

val data1 = Seq(("AAA",1), ("BBB",1), ("CCC",2))
val nodes_df = data1.toDF("node", "group")
nodes_df.show()

+----+-----+
|node|group|
+----+-----+
| AAA|    1|
| BBB|    1|
| CCC|    2|
+----+-----+
val data2 = Seq(("AAA","BBB",1), ("BBB","CCC",1))
val arcs_df = data2.toDF("node_from", "node_to", "weight")
arcs_df.show()

+---------+-------+------+
|node_from|node_to|weight|
+---------+-------+------+
|      AAA|    BBB|     1|
|      BBB|    CCC|     1|
+---------+-------+------+
创建节点

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
使用
行号
窗口
添加行号。我将orderBy从
group
更改为
node
,因为您无法保证AAA是否为1,BBB是否为2,反之亦然,因为它们具有相同的
group
编号

val nodes = nodes_df.withColumn("id",row_number().over(Window.orderBy("node")))
nodes.show()

+----+-----+---+
|node|group| id|
+----+-----+---+
| AAA|    1|  1|
| BBB|    1|  2|
| CCC|    2|  3|
+----+-----+---+
创建圆弧_df

val data1 = Seq(("AAA",1), ("BBB",1), ("CCC",2))
val nodes_df = data1.toDF("node", "group")
nodes_df.show()

+----+-----+
|node|group|
+----+-----+
| AAA|    1|
| BBB|    1|
| CCC|    2|
+----+-----+
val data2 = Seq(("AAA","BBB",1), ("BBB","CCC",1))
val arcs_df = data2.toDF("node_from", "node_to", "weight")
arcs_df.show()

+---------+-------+------+
|node_from|node_to|weight|
+---------+-------+------+
|      AAA|    BBB|     1|
|      BBB|    CCC|     1|
+---------+-------+------+
执行连接以获得所需的输出

现在,我们主要是想知道如何将
id
节点
映射到
arcs\u df
中的from/to节点。我通过使用两个连接实现了这一点。首先是从
节点
弧_-df
,创建一个中间数据帧,
第一个_-join _-df
,以便于说明。然后从
节点
第一次加入
。在连接之后,我会删除我不关心的列,如
,并将
id
列重命名为
节点(如果适用
/
节点)。我以一个
结束。选择(…
以获得您要求的订单。如果有任何不清楚的地方,请查看并告诉我。希望这有帮助

val first_join_df = arcs_df.join(nodes, arcs_df.col("node_from") === nodes.col("node"), "leftouter")
  .drop("node_from", "node", "group")
  .withColumnRenamed("id", "node_from")
first_join_df.show()

+-------+------+---------+
|node_to|weight|node_from|
+-------+------+---------+
|    BBB|     1|        1|
|    CCC|     1|        2|
+-------+------+---------+

val second_join_df = first_join_df.join(nodes, first_join_df.col("node_to") === nodes.col("node"), "leftouter")
  .drop("node_to", "node", "group")
  .withColumnRenamed("id", "node_to")
  .select("node_from", "node_to", "weight")
second_join_df.show()

+---------+-------+------+
|node_from|node_to|weight|
+---------+-------+------+
|        1|      2|     1|
|        2|      3|     1|
+---------+-------+------+

你能展示一下你试过的吗?可能是重复的