2017-08-11 6 views
0

を維持しながら、列データを選択し、私は500の以上の列と同じスキーマを持つ2つのSQLデータフレームがあります。私はそのようなそのデータフレームを返すたい2つ(PY)スパークのSQLデータフレームを比較し、条件付き結合列

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:]]) 

答えて

2

はここで、あなただけのも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