假设我有两个数据帧如下:
首先 -
A | B | C | D
1a | 1b | 1c | 1d
2a | null | 2c | 2d
3a | null | null | 3d
4a | 4b | null | null
5a | null | null | null
6a | 6b | 6c | null
第二 -
P | B | C | D
1p | 1b | 1c | 1d
2p | 2b | 2c | 2d
3p | 3b | 3c | 3d
4p | 4b | 4c | 4d
5p | 5b | 5c | 5d
6p | 6b | 6c | 6d
基于{“B”,“C”,“D”}执行连接操作。如果在这些列中的任何列中出现null,则应检查其余列中是否出现空值。
所以,结果应该是 -
P | B | C | D | A
1p | 1b | 1c | 1d | 1a
2p | null | 2c | 2d | 2a
3p | null | null | 3d | 3a
4p | 4b | null | null | 4a // First(C) & First(D) was null so we take only B
6p | 6b | 6c | null | 6a
有人可以为此查询建议任何解决方案吗? 目前我正在尝试过滤单列,两列,三列中具有空值的值。然后加入他们与第二,而不采取该列。例如 - 我首先从First中滤除了只有B为null的值。然后基于“C”和“D”将其与Second连接。 通过这种方式,我将获得许多数据帧,我将最终将它们联合起来。
答案 0 :(得分:2)
这是你可以做的事情
import org.apache.spark.sql.functions._
df1.join(broadcast(df2), df1("B") === df2("B") || df1("C") === df2("C") || df1("D") === df2("D"))
.drop(df2("B"))
.drop(df2("C"))
.drop(df2("D"))
.show(false)
为了更安全,您可以broadcast
dataframe
更小的尺寸。
答案 1 :(得分:0)
我认为左连接应该完成工作,尝试以下代码:
QDomDocument
希望这可以帮助你,否则评论你的问题