基于非空值加入spark数据帧(scala)

时间:2017-08-22 10:54:18

标签: scala apache-spark dataframe

假设我有两个数据帧如下:

首先 -

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连接。 通过这种方式,我将获得许多数据帧,我将最终将它们联合起来。

2 个答案:

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

希望这可以帮助你,否则评论你的问题