scala-有没有一种方法可以用每一行的自定义 join来 join两个spark DataFrame


0

我有两个 DataFrame df和df2,如下所示

+------+---+----+
|  name|age|city|
+------+---+----+
|  John| 25|  LA|
|  Jane| 26|  LA|
|Joseph| 28|  SA|
+------+---+----+

+---+----+------+
|age|city|salary|
+---+----+------+
| 25| LA| 40000|
| 26| | 50000|
| | SF| 60000|
+---+----+------+

我想要我的结果 DataFrame 如下

+------+---+----+------+
|  name|age|city|salary|
+------+---+----+------+
|  John| 25|  LA| 40000|
|  Jane| 26|  LA| 50000|
|Joseph| 28|  SF| 60000|
+------+---+----+------+

基本上这里我需要使用age、city作为 join列来 join,但是如果df2中的任何一列是空的,那么我只需要与另一个非空列 join。我正在寻找的解决方案应该是适用的,即使有大约5列要 join,只有非空列应该参与每行的 join。

2 答案


0

当你加入这些 DataFrame ,然后选择groupBy时,你可以给出更多的条件。

df1.join(df2, 
    ($"age" === $"age2" || $"age2".isNull) &&
    ($"city" === $"city2" || $"city2".isNull), "left")
   .show

结果将是:

+------+---+----+----+-----+-------+
|  name|age|city|age2|city2|salary2|
+------+---+----+----+-----+-------+
|  John| 25|  LA|  25|   LA|  40000|
|  Jane| 26|  LA|  26| null|  50000|
|Joseph| 28|  SF|null|   SF|  60000|
+------+---+----+----+-----+-------+

但是,当您有更多的列或者第二个 DataFrame 有更多的空值时,结果将更加复杂。


0
df1.join(df2,df1.col("age")===df2.col("age") || df1.col("city")===df2.col("city")).select(df1.col("name"),df1.col("age"),df1.col("city"),df2.col("salary")).show
+----+---+----+------+
|name|age|city|salary|
+----+---+----+------+
|john| 25|  LA| 40000|
|Jane| 26|  LA| 40000|
|Jane| 26|  LA| 50000|
+----+---+----+------+```

我来回答

写文章

提问题

面试题