Pyspark 中的多个 WHEN 条件实现

Posted

技术标签:

【中文标题】Pyspark 中的多个 WHEN 条件实现【英文标题】:Multiple WHEN condition implementation in Pyspark 【发布时间】:2019-07-15 22:41:26 【问题描述】:

我的 T-SQL 代码在下面,我在 Pyspark 中进行了转换,但给了我错误

CASE
            WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'OUT' AND time_on_site.timespent_sec < 72000 THEN 1  --  20 hours 
            WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'OUT' AND time_on_site.timespent_sec >= 72000 THEN 0
            WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'IN' AND time_on_site.timespent_sec <= 28800 THEN 2  -- 8 hours
            WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'IN' AND time_on_site.timespent_sec > 28800 THEN 3
            WHEN time_on_site.type_flag = 'TYPE4' THEN 4
            ELSE NULL
         END AS "type"

下面是我抛出错误的 Pyspark 脚本

from pyspark.sql.functions import when

TOS=TOS.withColumn('type', F.when( (col('eventaction') == 'IN') & (col('next_action') == 'OUT') & ("timespent_sec < 72000") , 1).
                            when( (col('eventaction') == 'IN') & (col('next_action') == 'OUT') & ("timespent_sec >= 72000") , 0).
                            when( (col('eventaction') == 'IN') & (col('next_action') == 'IN') & ("timespent_sec <= 28800") , 2).
                            when( (col('eventaction') == 'IN') & (col('next_action') == 'IN') & ("timespent_sec > 28800") , 3).
                            when(col('type_flag')=='TYPE4', 4).otherwise('NULL')
                            )

我哪里错了!?

【问题讨论】:

我看不出您的代码有任何明显错误。错误是什么? Spark Equivalent of IF Then ELSE的可能重复 【参考方案1】:

我不知道 T-SQL 语法,但是如果你想做if:.. elif: ...elif.... else,那么下面的代码就可以了。

from pyspark.sql.functions import when, col

TOS=TOS.withColumn('type', when( (col('eventaction') == 'IN') & (col('next_action') == 'OUT') & ("timespent_sec < 72000") , 1).
                            otherwise( when(   (col('eventaction') == 'IN') & (col('next_action') == 'OUT') & ("timespent_sec >= 72000") , 0).
                            otherwise( when(   (col('eventaction') == 'IN') & (col('next_action') == 'IN') & ("timespent_sec <= 28800") , 2).
                            otherwise( when(   (col('eventaction') == 'IN') & (col('next_action') == 'IN') & ("timespent_sec > 28800") , 3).
                            otherwise( when(   col('type_flag')=='TYPE4', 4).otherwise('NULL'))))))

【讨论】:

【参考方案2】:

我已经正确实现了,如下所示

import pyspark.sql.functions as F

TOS=TOS.withColumn('type', F.when( (F.col("eventaction") == 'IN') & (F.col("next_action") == 'OUT') & (F.col("timespent_sec") < 72000) , 1).
  when( (F.col("eventaction") == 'IN') & (F.col("next_action") == 'OUT') & (F.col("timespent_sec") >= 72000) , 0).
  when( (F.col("eventaction") == 'IN') & (F.col("next_action") == 'IN') & (F.col("timespent_sec") <= 28800) , 2).
  when( (F.col("eventaction") == 'IN') & (F.col("next_action") == 'IN') & (F.col("timespent_sec") > 28800) , 3).
  when(F.col('type_flag')=='TYPE4', 4).otherwise('NULL'))

【讨论】:

以上是关于Pyspark 中的多个 WHEN 条件实现的主要内容,如果未能解决你的问题,请参考以下文章

如何在字典中使用 pyspark.sql.functions.when() 的多个条件?

如何在 pyspark.sql.functions.when() 中使用多个条件?

如何在pyspark数据框中添加多个带有when条件的新列?

使用 pyspark 和 when 条件从另一个数据框创建列

如何在 PySpark 中编写条件正则表达式替换?

pyspark when else 语句返回不正确的输出