如何基于两列其他数据框向数据框添加新列

时间:2018-05-02 12:42:53

标签: scala apache-spark apache-spark-sql

我有两个DataFrame df_datadf_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_datalabel的值应取自srcLabeldstLabel

这就是我试图获取标签信息的方式:

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中创建两列dstLabeldf,而我只想获得一列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")

1 个答案:

答案 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  |
+------+------+-----+

我希望这能帮到你!