我有两个DataFrame df_data
和df_node_labels
:
df_data =
nodeId field1
1 abc
2 def
3 fed
4 kfl
df_node_labels =
srcId srcLabel dstId dstLabel
1 AAA 2 BBB
2 BBB 4 FFF
4 FFF 3 CCC
我想向label
添加一列df_data
。 label
的值应取自srcLabel
和dstLabel
:
这就是我试图获取标签信息的方式:
var df = df_data.join(df_node_labels.select("srcId","srcLabel"),col("nodeId")===col("srcId"),"left")
df = df.join(df_node_labels.select("dstId","dstLabel"),col("nodeId")===col("dstId"),"left")
但是,这会在srcLabel
中创建两列dstLabel
和df
,而我只想获得一列label
。
这是预期的结果:
df =
nodeId field1 label
1 abc AAA
2 def BBB
3 fed CCC
4 kfl FFF
更新
我可以这样做,但在我看来,做一件简单的事情还有很长的路要走:
df = df.withColumn("label", when(col("srcLabel") =!= "", col("srcLabel")).otherwise(col("dstLabel"))).drop("srcLabel").drop("dstLabel")
答案 0 :(得分:2)
您可以在df_node_labels
中创建一个唯一的数据作为finalDF
,并执行join
操作,这将为您提供预期的结果。
val finalDF = df_node_labels.select($"srcId".as("nodeId"), $"srcLabel".as("label"))
.union(
df_node_labels.select($"dstId".as("nodeId"), $"dstLabel".as("label"))
).dropDuplicates()
df_data.join(finalDF, Seq("nodeId"), "left")
.show(false)
输出:
+------+------+-----+
|nodeId|field1|label|
+------+------+-----+
|1 |abc |AAA |
|2 |def |BBB |
|3 |fed |CCC |
|4 |kfl |FFF |
+------+------+-----+
我希望这能帮到你!