Python PySpark,一种groupby,考虑序列

Python PySpark,一种groupby,考虑序列,python,pyspark,apache-spark-sql,Python,Pyspark,Apache Spark Sql,我有这样的数据集: +------+------+------+ | Time | Tool | Hole | +------+------+------+ | 1 | A | H1 | | 2 | A | H2 | | 3 | B | H3 | | 4 | A | H4 | | 5 | A | H5 | | 6 | B | H6 | +------+------+------+ 预期结果如下:这是

我有这样的数据集:

+------+------+------+
| Time | Tool | Hole |
+------+------+------+
|    1 | A    | H1   |
|    2 | A    | H2   |
|    3 | B    | H3   |
|    4 | A    | H4   |
|    5 | A    | H5   |
|    6 | B    | H6   |
+------+------+------+
预期结果如下:这是我的数据的一种时间聚合,其中序列很重要

+------+-----------+---------+
| Tool | Time_From | Time_To |
+------+-----------+---------+
| A    |         1 |       2 |
| B    |         3 |       3 |
| A    |         4 |       5 |
| B    |         6 |       6 |
+------+-----------+---------+
当前的结果,with groupby语句不符合我的期望,因为没有考虑序列

+------+-----------+---------+
| Tool | Time_From | Time_To |
+------+-----------+---------+
| A    |         1 |       5 |
| B    |         3 |       5 |
+------+-----------+---------+

rdd = rdd.groupby(['tool']).agg(min(rdd.time).alias('minTMSP'),
                                    max(rdd.time).alias('maxTMSP'))

我试图通过一个窗口函数,但到目前为止没有任何结果。。。知道我如何在pyspark中处理这个用例吗?

我们可以使用
lag
函数和
Window
类来检查每一行中的条目是否相对于前一行发生了更改。然后,我们可以使用同一个
窗口
计算累计总和,以找到要分组的列。从这一点上,很容易找到每个组的最小和最大时间

希望这有帮助

import pyspark.sql.functions as F
from pyspark.sql.window import Window

df = spark.createDataFrame([(1,'A'), (2,'A'), (3,'B'),(4,'A'),(5,'A'),(6,'B')], 
                           schema=['Time','Tool'])

w = Window.partitionBy().orderBy('Time')

df2 = (df.withColumn('Tool_lag',F.lag(df['Tool']).over(w))
.withColumn('equal',F.when(F.col('Tool')==F.col('Tool_lag'), F.lit(0)).otherwise(F.lit(1)))
.withColumn('group', F.sum(F.col('equal')).over(w))
.groupBy('Tool','group').agg(
    F.min(F.col('Time')).alias('start'),
    F.max(F.col('Time')).alias('end'))
.drop('group'))
df2.show()
输出:

+----+-----+---+
|Tool|start|end|
+----+-----+---+
|   A|    1|  2|
|   B|    3|  3|
|   A|    4|  5|
|   B|    6|  6|
+----+-----+---+

通过窗口功能查看这个答案-它应该会有帮助,如果没有,我将为您发布解决方案-