Apache spark 如何计算包含相同值的间隔(行集)的开始/结束?

Apache spark 如何计算包含相同值的间隔(行集)的开始/结束?,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,假设我们有一个如下所示的spark数据帧(按时间排序): +------+-------+ |时间价值| +------+-------+ |1 | A| |2 | A| |3 | A| |4 | B| |5 | B| |6 | A| +------+-------+ 我想计算每个连续值序列的开始/结束时间。上述数据帧的预期输出为: +-------+-------+-----+ |值|开始|结束| +-------+-------+-----+ |A | 1 | 3| |B | 4 | 5|

假设我们有一个如下所示的spark数据帧(按时间排序):

+------+-------+
|时间价值|
+------+-------+
|1 | A|
|2 | A|
|3 | A|
|4 | B|
|5 | B|
|6 | A|
+------+-------+
我想计算每个连续值序列的开始/结束时间。上述数据帧的预期输出为:

+-------+-------+-----+
|值|开始|结束|
+-------+-------+-----+
|A | 1 | 3|
|B | 4 | 5|
|A | 6 | 6|
+-------+-------+-----+
(最后一行的
end
值也可以是
null

通过简单的组聚合执行此操作:

.groupBy(“值”)
阿格先生(
F.min(“时间”)。别名(“开始”),
F.max(“时间”)。别名(“结束”)
)

没有考虑到相同的
值可以在多个不同的时间间隔内出现这一事实。

我们的想法是为每个组创建一个标识符,并使用它来分组并计算最小和最大时间

假设
df
是您的数据帧:

从pyspark.sql导入函数为F,窗口
df=df.withColumn(
“前景”,
F.什么时候(
F.lag('value').over(Window.orderBy(“time”)==F.col(“value”),
0
)。否则(1)
)
df=df.withColumn(
“rn”,
F.总额(“fg”)。超过(
窗口
.orderBy(“时间”)
.rowsBetween(Window.unbounddpreceiding,Window.currentRow)
)
)
从那时起,您就拥有了数据帧,其中包含每个连续组的标识符

df.show()
+----+-----+---+---+                                                            
|时间|值| rn | fg|
+----+-----+---+---+
|1 | A | 1 | 1|
|2 | A | 1 | 0|
|3 | A | 1 | 0|
|4 | B | 2 | 1|
|5 | B | 2 | 0|
|6 | A | 3 | 1|
+----+-----+---+---+
然后,您只需进行聚合

df.groupBy(
“价值”,
“注册护士”
)阿格先生(
F.min(“时间”)。别名(“开始”),
F.max(“时间”)。别名(“结束”)
).drop(“rn”).show()
+-----+-----+---+                                                               
|值|开始|结束|
+-----+-----+---+
|A | 1 | 3|
|B | 4 | 5|
|A | 6 | 6|
+-----+-----+---+