首页 > 解决方案 > 通过加入具有不同行数和多列的数据框来填充空值

问题描述

我试图搜索,但虽然我遇到了类似的情况,但我没有找到我要找的东西。

我有以下两个数据框:

+---------------------------+
|   ID|       Value|   type |
+---------------------------+
|  user0|     100  |   Car  |
|  user1|     102  |   Car  |
|  user2|     109  |   Dog  |
|  user3|     103  |   NA   |
|  user4|     110  |   Dog  |
|  user5|     null |   null |
|  user6|     null |   null |
|  user7|     null |   null |
+---------------------------+

+---------------------------+
|   ID2|     Value2|  type2|
+---------------------------+
|  user5|     115  |  Cell  |
|  user6|     103  |  Cell  |
|  user7|     100  |  Fridge|
+---------------------------+

我想加入这两个,结果如下:

+---------------------------+
|   ID|       Value|   type |
+---------------------------+
|  user0|     100  |   Car  |
|  user1|     102  |   Car  |
|  user2|     109  |   Dog  |
|  user3|     103  |   NA   |
|  user4|     110  |   Dog  |
|  user5|     115  |   Cell |
|  user6|     103  |   Cell |
|  user7|     100  | Fridge |
+---------------------------+  

我尝试了以下方法,但没有返回预期的结果:

df_joined= df1.join(df2,(df1.id==df2.id2) &
                      (df1.value==df2.value2) &
                     (df1.type==df2.type2),
                      "left").drop('id2','value2','type2')  

我只从第一个 df 中获取值,可能 left 不是正确的连接类型,但我不明白应该使用什么。

标签: sqldataframeapache-sparkpysparkapache-spark-sql

解决方案


您只需要使用 ID 加入,而不是其他列,因为其他列不一样。要组合其他列,请使用coalesce,它给出第一个非空值。

import pyspark.sql.functions as F

df_joined = df1.join(df2, df1.ID == df2.ID2, 'left').select(
    'ID',
    F.coalesce(df1.Value, df2.Value2).alias('Value'),
    F.coalesce(df1.type, df2.type2).alias('type')
)

df_joined.show()
+-----+-----+------+
|   ID|Value|  type|
+-----+-----+------+
|user0|  100|   Car|
|user1|  102|   Car|
|user2|  109|   Dog|
|user3|  103|    NA|
|user4|  110|   Dog|
|user5|  115|  Cell|
|user6|  103|  Cell|
|user7|  100|Fridge|
+-----+-----+------+

推荐阅读