scala spark,比较两个Dataframe并选择另一列的值

cx6n0qe3  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(633)

我有两个Dataframe。我想做的就是:
如果列名是“p”,那么我必须选择名为finalvalue的df2列,其中列id\u 1与df2的列id\u名称匹配,否则我必须用null填充它。
例如,我有以下Dataframe(df1和df2):

+--------+-------+-------+
|Name    | value | id_1  |
+- ------+-------+-------+
|P       |5      | being |      
|X       |1      | dose  |
|Z       |1      | yex   |

df2
+--------+------------+
|Id_name | FinalValue |
+- ------+------------+
|ash     | h32        |
|being   | c11        |
|dose    | g21        |

在这种情况下,输出应为:

+--------+-------+-------------+
|Name    | value | FinalValue  | 
+- ------+-------+-------------+
|P       |5      | c11         |      
|X       |1      | null        |
|Z       |1      | null        |

我尝试的是:

var df3 = df1.withColumn("FinalValue", when($"Name" === "P", df2.select(...)))

但正如您所看到的,我不知道如何继续,因为如果我选择df2的一列,我就不能选择df1的另一列。我该怎么做?
也许我的解释不够好,如果你需要更多的信息或解释,就告诉我。提前谢谢。

f2uvfpb9

f2uvfpb91#

可以执行左连接,然后使用 when :

val df3 = df1.join(
    df2,
    df1("id_1") === df2("Id_name"),
    "left"
).select(
    df1.columns.dropRight(1).map(col) :+
    when($"Name" === "P", $"FinalValue").as("FinalValue")
    : _*
)

df3.show
+----+-----+----------+
|Name|value|FinalValue|
+----+-----+----------+
|   P|    5|       c11|
|   X|    1|      null|
|   Z|    1|      null|
+----+-----+----------+

相关问题