Apache spark 如何计算包含相同值的间隔(行集)的开始/结束?
假设我们有一个如下所示的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|
+------+-------+
|时间价值|
+------+-------+
|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|
+-----+-----+---+