【问题标题】:HI,Could you please help me resolving Issue while creating new column in Pyspark: I explained the issue as below:嗨,在 Pyspark 中创建新列时,您能帮我解决问题吗:我解释了以下问题:
【发布时间】:2018-10-27 16:55:20
【问题描述】:

我正在使用的查询:

我想在条件下用新值替换现有列,如果另一个 col = ABC 的值那么列保持不变,否则应该给出 null 或空白。 它根据逻辑给出结果,但仅针对它在循环中遇到的最后一列。

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   |
+------+----+-----+-------+

【问题讨论】:

  • 请修正缩进
  • 您每次都在循环内覆盖new_df

标签: pyspark pyspark-sql


【解决方案1】:

您的代码中的问题是您在循环的每次迭代中都用原始 DataFrame df 覆盖了 new_df。您可以通过首先在循环外设置new_df = df,然后在循环内对new_df 执行withColumn 操作来修复它。

例如,如果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|
#+----+----+----+------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-11
    • 2020-08-26
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多