如何在Dataframe和Pyspark中使用多个条件更新行

3
如何在DataFrame中更新行(使用Pyspark,而非scala),其中更新应该基于某些条件发生?在设计时我们不知道会有多少个条件或它们是什么,因此条件和更新值需要在运行时应用。 示例DataFrame。
表T1:
| Emp_LName | Emp_FName     |  Sal          |   Sal_Grade  | 
| -------- | -------------- |-------------- |------------- |
| Smith    | Bob            |100000         |B             |
| Barnes   | Jim            |90000          |B             |
| Rogers   | Eric           |120000         |A             |
| Carson   | Ben            |45000          |C             |

df_source = spark.sql("Select * from T1)

lst_Conditions =[(Sal= 45000,Sal_Grade=E),(E_Name='Bob',E_Name='Robert),(One more candition),...].

基本上这些条件应被解释为 “当 Sal=45000 时,将 Sal_Grade 设置为 E”。

我应该如何编写代码来更新数据框中的每个条件? 非常感谢您的任何帮助。

谢谢 R


条件将如何提供?你现在拥有的不是有效的 Python。 - ScootCork
条件以字符串形式通过shell脚本提交给Spark Submit作业,每个条件都用括号括起来,例如(Sal=45000,Sal_Grade=E),(Emp_FName='Bob', Emp_FName='Robert')。其解释是:“当Sal=45000时,将Sal_grade更新为E”,“当Emp_FName=Bob时,将Emp_FName更新为Robert”。 - Ranjit
1个回答

2
df_source = spark.createDataFrame(
  [
     ('Smith','Bob',100000,'B')
    ,('Barnes','Jim',90000,'B')
    ,('Rogers','Eric',120000,'A')
    ,('Carson','Ben',45000,'C')
  ], ['Emp_LName','Emp_FName','Sal','Sal_Grade']
)
                                           
lst_Conditions = [
    ('Cond_1', 'CASE WHEN Sal = 45000 THEN "E" END'),
    ('Cond_2', 'CASE WHEN Emp_FName = "Bob" THEN "V" END')
]

from pyspark.sql import functions as F

df_source = df_source.withColumn('coalesce', F.lit(None))

for c in lst_Conditions:
    df_source = df_source\
                          .withColumn(c[0], F.expr(c[1]))\
                          .withColumn('coalesce', F.coalesce('coalesce', F.col(c[0])))
                        


df_source\
          .withColumn('Sal_Grade', 
                      F.when(F.col('coalesce').isNull(), F.col('Sal_Grade')).otherwise(F.col('coalesce')))\
          .select('Emp_LName','Emp_FName','Sal','Sal_Grade')\
          .show()    


# +---------+---------+------+---------+
# |Emp_LName|Emp_FName|   Sal|Sal_Grade|
# +---------+---------+------+---------+
# |    Smith|      Bob|100000|        V|
# |   Barnes|      Jim| 90000|        B|
# |   Rogers|     Eric|120000|        A|
# |   Carson|      Ben| 45000|        E|
# +---------+---------+------+---------+

1
非常感谢。那么我们需要将条件列表转换为上述格式。但是我无法添加Cond_1、Cond_2列。我如何将Sal_Grade更新为“E”,并将Emp_FName Bob更新为“V”? - Ranjit
你说的更新这些列是什么意思?请更加明确。 - Luiz Viola
目标是更新Sal_Grade列,当Sal = 45000时,SAL_Grade = E。 但根据您的示例,Col(Cond_1)= E,其中Sal为45000。| Carson | Ben | 45000 | C | E | null | +---------+---------+------+---------+------+------+ - Ranjit
编辑了答案以更新 Sal_Grade 列。 - Luiz Viola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接