【问题标题】:PySpark fill null values when respective column flag is zero当相应的列标志为零时,PySpark 填充空值
【发布时间】:2021-06-23 00:20:02
【问题描述】:
我有如下两个数据框
df1
| column1 |
column2 |
column3 |
| abc |
021 |
abc456 |
| def |
456 |
xyz098 |
df2
| ref |
column1 |
column2 |
column3 |
| A |
1 |
0 |
1 |
| B |
0 |
0 |
1 |
我想将 df1 列值填充为 null,其中 df2 数据帧参考值 A 为零
out_df_refA
| column1 |
column2 |
column3 |
| abc |
Null |
abc456 |
| def |
Null |
xyz098 |
df2 数据帧中的参考值 B 也是如此
out_df_refB
| column1 |
column2 |
column3 |
| Null |
Null |
abc456 |
| Null |
Null |
xyz098 |
【问题讨论】:
标签:
apache-spark
pyspark
apache-spark-sql
【解决方案1】:
您可以交叉联接到已过滤的df2,并使用when 仅在标志不等于0 时保留df1 中的值。
import pyspark.sql.functions as F
out_df_refA = (df1.alias('df1')
.crossJoin(df2.filter("ref = 'A'").drop('ref').alias('df2'))
.select(*[F.when(F.col('df2.' + c) != 0, F.col('df1.' + c)).alias(c) for c in df1.columns])
)
out_df_refA.show()
+-------+-------+-------+
|column1|column2|column3|
+-------+-------+-------+
| abc| null| abc456|
| def| null| xyz098|
+-------+-------+-------+
import pyspark.sql.functions as F
out_df_refB = (df1.alias('df1')
.crossJoin(df2.filter("ref = 'B'").drop('ref').alias('df2'))
.select(*[F.when(F.col('df2.' + c) != 0, F.col('df1.' + c)).alias(c) for c in df1.columns])
)
out_df_refB.show()
+-------+-------+-------+
|column1|column2|column3|
+-------+-------+-------+
| null| null| abc456|
| null| null| xyz098|
+-------+-------+-------+