比较两个 (py) 火花 sql 数据帧,并在保留联接列的同时有条件地选择列数据



我有两个具有相同架构的 sql 数据帧,具有 500+ 列:

df_A
+----+---+---+...
| id | A | B |...
+----+---+---+...
| w1 | 0 | 1 |...
+----+-- +---+...
| w2 | 1 | 1 |...
+----+-- +---+...
| w3 | 0 | 1 |...
+----+-- +---+...
df_B
+----+---+---+...
| id | A | B |...
+----+---+---+...
| w1 | 0 | 1 |...
+----+-- +---+...
| w2 | 0 | 1 |...
+----+-- +---+...
| w3 | 0 | 1 |...
+----+-- +---+...

我想返回一个数据帧,当 df_A. 为 1 时,否则为 1 的值为 df_B。


下面的代码能够正确返回列比较,但我无法添加 id 列。 有什么建议吗?

results = df_A.alias("a").join(df_B.alias("b"), "id").selectExpr(["case when b.`{0}` = 1 then 1 else a.`{0}` end as `{0}`".format(yy) for yy in df_b.columns[1:]])

在这里,您只想在selectExpr()中选择"Master_ID"。但是,由于其余的参数是构建为列表的,因此您不能将其传递到列表旁边。您需要将其添加到列表中,例如:

select_exprs = [...]
select_exprs.append("Master_ID")
....selectExpr(select_exprs)

或者更完整地说:

column_select = ["Master_ID"]
select_expr = ["case when b.`{0}` = 1 then 1 else a.`{0}` end as `{0}`".format(yy) for yy in prediction_df.columns[1:]]
column_select = column_select + select_expr
results = wide_pred_df.alias("a").join(prediction_df.alias("b"),"Master_ID").selectExpr(column_select)
results.printSchema

最新更新