比较两个(py)spark sql数据框并在保持连接列的同时有条件地选择列数据

Posted

技术标签:

【中文标题】比较两个(py)spark sql数据框并在保持连接列的同时有条件地选择列数据【英文标题】:Compare two (py) spark sql dataframes and conditionally select column data while keeping joined column 【发布时间】:2017-08-11 14:25:15 【问题描述】:

我有两个具有相同架构的 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:]])

【问题讨论】:

【参考方案1】:

在这里,您只想在selectExpr() 中也选择"Master_ID"。但是,因为其余的 args 是作为一个列表构建的,所以你不能也将它传递到列表旁边。您需要将其添加到列表中,例如:

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

【讨论】:

以上是关于比较两个(py)spark sql数据框并在保持连接列的同时有条件地选择列数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 语句中引用组合框并在 VBA 中运行该语句

Spark-SQL:如何将 TSV 或 CSV 文件读入数据框并应用自定义模式?

如何比较两个熊猫数据框并返回将它们相互映射的索引?

根据列值(字符串,子字符串)比较两个数据框并更新另一个列值

如何基于查找数据框创建数据框并在特定列中的动态和映射值上创建多列

打开元组数据框并执行操作[关闭]