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