代码之家  ›  专栏  ›  技术社区  ›  Sandy

您好,在Pyspark中创建新专栏时,您能帮我解决这个问题吗:我对这个问题的解释如下:

  •  0
  • Sandy  · 技术社区  · 6 年前

    它根据逻辑给出结果,但只针对它在循环中遇到的最后一列。

    import pyspark.sql.functions as F
    
    for i in df.columns:
        if i[4:]!='ff':        
            new_df=df.withColumn(i,F.when(df.col_ff=="abc",df[i])\
           .otherwise(None))
    
    df:
    +------+----+-----+-------+
    | col1 |col2|col3 | col_ff|
    +------+----+-----+-------+
    |   a  | a  | d   | abc   |
    |   a  | b  | c   | def   |
    |   b  | c  | b   | abc   |
    |   c  | d  | a   | def   |
    +------+----+-----+-------+
    

    +------+----+-----+-------+
    | col1 |col2|col3 | col_ff|
    +------+----+-----+-------+
    |   a  | a  | d   | abc   |
    | null |null|null | def   |
    |   b  | c  | b   | abc   |
    | null |null|null | def   |
    +------+----+-----+-------+
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   pault Tanjin    6 年前

    代码中的问题是您正在覆盖 new_df 使用原始数据帧 df new_df = df 在循环之外,然后执行 withColumn 新建\u df

    测向 具体如下:

    df.show()
    #+----+----+----+------+
    #|col1|col2|col3|col_ff|
    #+----+----+----+------+
    #|   a|   a|   d|   abc|
    #|   a|   b|   c|   def|
    #|   b|   c|   b|   abc|
    #|   c|   d|   a|   def|
    #+----+----+----+------+
    

    import pyspark.sql.functions as F
    
    new_df = df
    for i in df.columns:
        if i[4:]!='ff':        
            new_df = new_df.withColumn(i, F.when(F.col("col_ff")=="abc", F.col(i)))
    

    注意这里我删除了 .otherwise(None) 部分原因 when null 默认情况下,如果不满足条件。

    functools.reduce :

    from functools import reduce  # for python3
    new_df = reduce(
        lambda df, i: df.withColumn(i, F.when(F.col("col_ff")=="abc", F.col(i))),
        [i for i in df.columns if i[4:] != "ff"], 
        df
    )
    

    在这两种情况下,结果是相同的:

    new_df.show()
    #+----+----+----+------+
    #|col1|col2|col3|col_ff|
    #+----+----+----+------+
    #|   a|   a|   d|   abc|
    #|null|null|null|   def|
    #|   b|   c|   b|   abc|
    #|null|null|null|   def|
    #+----+----+----+------+