gpt4 book ai didi

apache-spark - 如何通过比较pyspark中的两个数据框来获取更新或新记录

转载 作者:行者123 更新时间:2023-12-04 13:06:34 25 4
gpt4 key购买 nike

我有两个这样的数据框:

df2.show()

+----+-------+------+
|NAME|BALANCE|SALARY|
+----+-------+------+
|PPan| 11| 500|
|Liza| 20| 900|
+----+-------+------+

df3.show()

+----+-------+------+
|NAME|BALANCE|SALARY|
+----+-------+------+
|PPan| 10| 700|
| Cal| 70| 888|
+----+-------+------+

df2 表示现有数据库记录,df3 表示需要插入/更新到数据库中的新记录/更新记录(任何列)。例如: NAME=PPan 根据 df3,新余额为 10。所以对于 NAME=PPan 整行必须在 df2 中替换,对于 NAME=Cal,必须添加一个新行对于 name=Liza 将像这样保持不变:

    +----+-------+------+
|NAME|BALANCE|SALARY|
+----+-------+------+
|PPan| 10| 700|
|Liza| 20| 900|
| Cal| 70| 888|
+----+-------+------+

我怎样才能实现这个用例?

最佳答案

首先,您需要使用 full 方法连接两个数据帧以保留不匹配的行(新)并更新匹配的记录我更喜欢使用 select合并函数:

joined_df = df2.alias('rec').join(df3.alias('upd'), on='NAME', how='full')
# +----+-------+------+-------+------+
# |NAME|BALANCE|SALARY|BALANCE|SALARY|
# +----+-------+------+-------+------+
# |Cal |null |null |70 |888 |
# |Liza|20 |900 |null |null |
# |PPan|11 |500 |10 |700 |
# +----+-------+------+-------+------+

output_df = joined_df.selectExpr(
'NAME',
'COALESCE(upd.BALANCE, rec.BALANCE) BALANCE',
'COALESCE(upd.SALARY, rec.SALARY) SALARY'
)

output_df.sort('BALANCE').show(truncate=False)
+----+-------+------+
|NAME|BALANCE|SALARY|
+----+-------+------+
|PPan|10 |700 |
|Liza|20 |900 |
|Cal |70 |888 |
+----+-------+------+

关于apache-spark - 如何通过比较pyspark中的两个数据框来获取更新或新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69192581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com