【问题标题】: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|
    +-------+-------+-------+
    

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 2020-11-29
      • 2021-12-07
      • 1970-01-01
      • 2019-11-18
      • 2016-10-11
      • 2020-04-20
      • 2021-08-15
      • 2021-10-15
      相关资源
      最近更新 更多