我有2个Dataframe,我需要有条件地将单个列合并在一起。只要id列中有空值,我就需要引用另一个DF来从那里获取值。
HomePage
我的最终结果是:
df1.show()
+-----+---+----+-----+
|group|cat| id|value|
+-----+---+----+-----+
| X| A| 1| 20.0|
| X| A| 2| 20.0|
| X| A|null| 55.0|
| X| B| 1| 20.0|
| X| B|null| 55.0|
| Y| A| 3| 20.0|
| Y| A| 4| 20.0|
| Y| A|null| 55.0|
| Y| B| 4| 20.0|
| Y| B|null| 55.0|
+-----+---+----+-----+
df2.show()
+---+-------+
|cat| id|
+---+-------+
| A|1 2 3 4|
| B| 1 4|
+---+-------+
我在这里尝试了类似于另一个答案的内容(Conditional Join in Spark DataFrame)
+-----+---+-------+-----+
|group|cat| id|value|
+-----+---+-------+-----+
| X| A| 1| 20.0|
| X| A| 2| 20.0|
| X| A|1 2 3 4| 55.0|
| X| B| 1| 20.0|
| X| B| 1 4| 55.0|
| Y| A| 3| 20.0|
| Y| A| 4| 20.0|
| Y| A|1 2 3 4| 55.0|
| Y| B| 4| 20.0|
| Y| B| 1 4| 55.0|
+-----+---+-------+-----+
但总是以空数据帧结束。
有关正确连接条件的任何想法?
答案 0 :(得分:0)
您可以加入这两个数据框,然后使用id
函数从id
更新df2
coalesce
:
(df1.join(df2.withColumnRenamed("id", "id2"), Seq("cat"), "left")
.withColumn("id", coalesce($"id", $"id2")).drop("id2").show)
+---+-----+-------+-----+
|cat|group| id|value|
+---+-----+-------+-----+
| A| X| 1| 20.0|
| A| X| 2| 20.0|
| A| X|1 2 3 4| 55.0|
| B| X| 1| 20.0|
| B| X| 1 4| 55.0|
| A| Y| 3| 20.0|
| A| Y| 4| 20.0|
| A| Y|1 2 3 4| 55.0|
| B| Y| 4| 20.0|
| B| Y| 1 4| 55.0|
+---+-----+-------+-----+