这与用新值更新数据框列密切相关,除了您还想添加数据框B中的行。一种方法是首先执行链接的问题中概述的 *** 作,然后将结果与数据框B合并并删除重复。
例如:
dfA.alias('a').join(dfB.alias('b'), on=['col_1'], how='left') .select( 'col_1', f.when( ~f.isnull(f.col('b.col_2')), f.col('b.col_2') ).otherwise(f.col('a.col_2')).alias('col_2'), 'b.col_3' ) .union(dfB) .dropDuplicates() .sort('col_1') .show()#+-----+-----+-----+#|col_1|col_2|col_3|#+-----+-----+-----+#| a| wew| 1|#| b| eee| null|#| c| rer| 3|#| d| yyy| 2|#+-----+-----+-----+
如果您有很多要替换的列并且不想对它们全部进行硬编码,则可以更一般地使用列表推导:
cols_to_update = ['col_2']dfA.alias('a').join(dfB.alias('b'), on=['col_1'], how='left') .select( *[ ['col_1'] + [ f.when( ~f.isnull(f.col('b.{}'.format(c))), f.col('b.{}'.format(c)) ).otherwise(f.col('a.{}'.format(c))).alias(c) for c in cols_to_update ] + ['b.col_3'] ] ) .union(dfB) .dropDuplicates() .sort('col_1') .show()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)