sql—通过连接具有不同行数和多列的dataframe来填充空值

r3i60tvu  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(278)

我试过搜索,但虽然我得到了类似的情况,我没有找到我要找的。
我有以下两个Dataframe:

+---------------------------+
|   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不是right连接类型,但我不明白应该使用什么。

izj3ouym

izj3ouym1#

您只需要使用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|
+-----+-----+------+
ykejflvf

ykejflvf2#

也可以使用并集,然后获得最大值:

from pyspark.sql import functions as F

result = df1.union(df2).groupBy("ID").agg(
    F.max("value").alias("value"),
    F.max("type").alias("type")
)

result.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|

# +-----+-----+------+

相关问题