pyspark根据关键字比较两个 Dataframe 的所有列,未知模式,但两个 Dataframe 的模式相同

xxls0lw8  于 2023-03-03  发布在  Apache
关注(0)|答案(1)|浏览(120)

pyspark根据关键字比较两个 Dataframe 的所有列,未知模式,但两个 Dataframe 的模式相同
模式各不相同,但我希望比较两个 Dataframe 以查看所有列的变化
示例数据集
第1天输入记录

Customerid  Balance
1   100
2   200
3   300

第2天输入记录

Customerid  Balance
1   200
2   200
3   300
4   400

关键字是customerid,如何根据关键字customerid找出所有其他列(这里是balance)中的变化
期望输出

Customerid  Balance is_active
1   100 N
2   200 Y
3   300 Y
1   200 Y
4   400 Y

只有customerid 1的余额更改活动标志需要设置为N

2j4z5cfb

2j4z5cfb1#

如果我理解正确的话-你需要比较两个 Dataframe 的基础上的所有列以外的关键列。
在这种情况下,下面的将工作(即使有更多的列不仅仅是平衡):

df2.alias("df2").join(df1.alias("df1"), [F.col("df2.Customerid") == F.col("df1.Customerid")], "left")\
.select("df2.Customerid", *[F.col("df2."+col) for col in df1.schema.names if col!="Customerid"]+[F.when(F.col("df1."+col) != F.col("df2."+col), "Mismatch").otherwise("Match").alias(col+"_IsMatch") for col in df1.schema.names if col!="Customerid"])\
.show()

输入(DF1-DF2):

+----------+-------+
|Customerid|Balance|
+----------+-------+
|         1|    100|
|         2|    200|
|         3|    300|
+----------+-------+

+----------+-------+
|Customerid|Balance|
+----------+-------+
|         1|    200|
|         2|    200|
|         3|    300|
|         4|    400|
+----------+-------+

输出:

+----------+-------+---------------+
|Customerid|Balance|Balance_IsMatch|
+----------+-------+---------------+
|         1|    200|       Mismatch|
|         2|    200|          Match|
|         3|    300|          Match|
|         4|    400|          Match|
+----------+-------+---------------+

我确实有一些问题,虽然你的例子不能回答。

  • 在您的示例中,来自df2且在df1中没有对应行的customerId为4的记录将保留在输出中,如果df1中也有这样的记录(在df2中没有匹配行)-您期望什么?
  • 在您的示例中,由于customerId 1的余额发生了变化,您在in_active列中将其标记为N,那么为什么将customerId 1的另一行标记为Y?

让我知道这些,我会更新我的答案。

相关问题