【问题标题】:Is there a way I can simplify my case when statement有没有办法可以简化我的情况
【发布时间】:2022-10-23 09:38:55
【问题描述】:

我正在尝试编写一个代码(spark-sql),将分区数据分类为 ST。

基本上,目标是结束另一列Open ST,它将仅显示打开的 ST(打开的 ST 由在 ST 之后的任何地方都没有任务 RW 来确定)。

最终目标:

所以在这种情况下 item12346 将以 ST 结尾,因为在任务 ST 之后的任何地方都没有任务 RW。项目12345 不会是开放的ST,因为RW 存在于ST 之后的某处。

如您所见,ST 之后可能会出现其他任务,但这不一定相关,因为我关心任务 ST 和 RW。

关于如何编码的任何想法。为了完全透明,我创建了基于NextTask、Lag 和Lastvalue 等分区的其他列,并且我对它们使用了CASE WHEN 子句,但我认为它们可能会让我的事情变得复杂:

CASE WHEN code_task = 'ST' AND lastvalue = 'CR' AND Lag_ NOT LIKE '%RW'AND Next_Task NOT LIKE '%RW%' THEN 'ST' END AS Open ST

希望通过查看我提供的表格有一个更简单的解决方案。谢谢!

【问题讨论】:

  • 你能接受答案吗?我确信这是正确的。

标签: apache-spark-sql


【解决方案1】:

问题在数据方面尚不清楚,这是一种基于一些假设的方法。不,不是案例,而是另一种方式。

代码

import spark.implicits._
import org.apache.spark.sql.functions._

// Unclear if code is asc or unique, otherwise a zipWithIndex needed. 
// Assumed code c can be used, seems that we just need to look for RW and it is after the ST.

val df = spark.sparkContext.parallelize(Seq( (1,7,"ST"), (1,8,"XX"), (1,9,"RW"), (3,10,"ST"), (3,11,"AA"), (3,12,"RW"), (2,3,"ST"), (2,4,"TT"))).toDF("i", "c", "t")
df.createOrReplaceTempView("data")

val res = spark.sql(""" SELECT i as iN
                          FROM data
                         WHERE t = 'RW' 
                    """)
val temp = df.join(res, df("i") === res("iN"), "outer")
val results = temp.withColumn("openST", when(col("iN").isNull && col("t") === lit("ST"), lit("ST")).otherwise("")).select($"i", $"c", $"t", $"openST")
results.show(false)

结果

+---+---+---+------+
|i  |c  |t  |openST|
+---+---+---+------+
|1  |7  |ST |      |
|1  |8  |XX |      |
|1  |9  |RW |      |
|2  |3  |ST |ST    |
|2  |4  |TT |      |
|3  |10 |ST |      |
|3  |11 |AA |      |
|3  |12 |RW |      |
+---+---+---+------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2015-02-12
    • 1970-01-01
    • 2021-08-28
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多