比较两个(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数据框并在保持连接列的同时有条件地选择列数据的主要内容,如果未能解决你的问题,请参考以下文章
Spark-SQL:如何将 TSV 或 CSV 文件读入数据框并应用自定义模式?