Apache Spark 有没有一种方法可以简化我的情况时,声明

3lxsmp7m  于 2023-05-29  发布在  Apache
关注(0)|答案(1)|浏览(190)

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

基本上,目标是以另一列Open ST结束,该列将仅显示打开ST(打开ST是由ST之后的任何位置都没有任务RW确定的)。
最终目标:

因此,在本例中,12346项将以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

希望能有一个简单的解决方案,只要看看我提供的表格。谢谢你!

tkclm6bt

tkclm6bt1#

问题是不清楚的数据方面,这里是一个方法的基础上作出的一些假设。不,不是用case,而是用另一种方式。

编码

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

相关问题