Pyspark spark sql表达式中的IF和ELSE语句
我希望运行一个sql表达式,检查下一个事件是“已交付”还是“已取消订单”,并根据第一个事件返回不同的结果Pyspark spark sql表达式中的IF和ELSE语句,pyspark,apache-spark-sql,pyspark-dataframes,Pyspark,Apache Spark Sql,Pyspark Dataframes,我希望运行一个sql表达式,检查下一个事件是“已交付”还是“已取消订单”,并根据第一个事件返回不同的结果 df = spark.createDataFrame([["ORDER", "2009-11-23", "1"], ["DELIVERED", "2009-12-17", "1"], ["ORDER-CANCELED", "2009-11-25
df = spark.createDataFrame([["ORDER", "2009-11-23", "1"], ["DELIVERED", "2009-12-17", "1"], ["ORDER-CANCELED", "2009-11-25", "1"], ["ORDER", "2009-12-03", "1"]]).toDF("EVENT", "DATE", "ID")
+--------------+----------+---+
| EVENT| DATE| ID|
+--------------+----------+---+
| ORDER|2009-11-23| 1|
|ORDER-CANCELED|2009-11-25| 1|
| ORDER|2009-12-03| 1|
| DELIVERED|2009-12-17| 1|
+--------------+----------+---+
我已经使用以下代码编写了一个仅适用于已交付事件的语句:
df = df.withColumn("NEXT", f.expr("""
case when EVENT = 'ORDER' then
first(if(EVENT in ('DELIVERED'), 'SUCCESS', null), True)
over (Partition By ID ORDER BY ID, DATE ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
else null end
"""))
这是可行的,但我不知道如何为else语句“ORDER-cancelled”添加第二个条件
df = df.withColumn("NEXT", f.expr("""
case when EVENT = 'ORDER' then
first(if(EVENT in ('DELIVERED'), 'SUCCESS', null)
**elseif(EVENT in ('ORDER-CANCELED'), 'CANCELED'), True)**
over (Partition By ID ORDER BY ID, DATE ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
else null end
"""))
也许是这样的
df=df.withColumn(
“下一步”,
f、 表达式(“”)
事件为'ORDER'时的情况,然后
首先(
事件发生在(“已交付”)时,则
“成功”
当事件处于(“订单取消”)状态时
“取消”
其他的
无效的
结束
)over(按ID划分,按ID排序,日期行介于1个后续项和无界后续项之间)
否则无效
结束
"""))
当无处不在时,为什么不使用一个案例呢?这就是sql“if-then”语句。不要混合语法