在pyspark数据框中查找连续数据

时间:2019-05-16 16:48:56

标签: pyspark apache-spark-sql

我有一个看起来像

的数据框
key | value | time | status
x   | 10    | 0    | running
x   | 15    | 1    | running
x   | 30    | 2    | running
x   | 15    | 3    | running
x   | 0     | 4    | stop
x   | 40    | 5    | running
x   | 10    | 6    | running
y   | 10    | 0    | running
y   | 15    | 1    | running
y   | 30    | 2    | running
y   | 15    | 3    | running
y   | 0     | 4    | stop
y   | 40    | 5    | running
y   | 10    | 6    | running
...

我想要一个看起来像这样的表

key | start | end | status | max value
x   | 0     | 3   | running| 30
x   | 4     | 4   | stop   | 0
x   | 5     | 6   | running| 40
y   | 0     | 3   | running| 30
y   | 4     | 4   | stop   | 0
y   | 5     | 6   | running| 40
...

换句话说,我想按key拆分,按time排序,分成具有相同status的窗口,保留第一个和最后一个time并执行该窗口上的计算,即max的{​​{1}}

理想地使用pyspark。

1 个答案:

答案 0 :(得分:1)

这是您可以采用的一种方法。

首先创建一列以确定给定的com.squareup.retrofit2:retrofit:2.5.0 的{​​{1}}是否已更改:

status

接下来,用key填充from pyspark.sql.functions import col, lag from pyspark.sql import Window w = Window.partitionBy("key").orderBy("time") df = df.withColumn( "status_change", (col("status") != lag("status").over(w)).cast("int") ) df.show() #+---+-----+----+-------+-------------+ #|key|value|time| status|status_change| #+---+-----+----+-------+-------------+ #| x| 10| 0|running| null| #| x| 15| 1|running| 0| #| x| 30| 2|running| 0| #| x| 15| 3|running| 0| #| x| 0| 4| stop| 1| #| x| 40| 5|running| 1| #| x| 10| 6|running| 0| #| y| 10| 0|running| null| #| y| 15| 1|running| 0| #| y| 30| 2|running| 0| #| y| 15| 3|running| 0| #| y| 0| 4| stop| 1| #| y| 40| 5|running| 1| #| y| 10| 6|running| 0| #+---+-----+----+-------+-------------+ ,并按null0列的累积总和:

status_change

现在,您可以汇总keyfrom pyspark.sql.functions import sum as sum_ # avoid shadowing builtin df = df.fillna(0).withColumn( "status_group", sum_("status_change").over(w) ) df.show() #+---+-----+----+-------+-------------+------------+ #|key|value|time| status|status_change|status_group| #+---+-----+----+-------+-------------+------------+ #| x| 10| 0|running| 0| 0| #| x| 15| 1|running| 0| 0| #| x| 30| 2|running| 0| 0| #| x| 15| 3|running| 0| 0| #| x| 0| 4| stop| 1| 1| #| x| 40| 5|running| 1| 2| #| x| 10| 6|running| 0| 2| #| y| 10| 0|running| 0| 0| #| y| 15| 1|running| 0| 0| #| y| 30| 2|running| 0| 0| #| y| 15| 3|running| 0| 0| #| y| 0| 4| stop| 1| 1| #| y| 40| 5|running| 1| 2| #| y| 10| 6|running| 0| 2| #+---+-----+----+-------+-------------+------------+ 。您还可以在key中包含status_group,因为每个status都相同。最后,只选择要在输出中显示的列。

groupBy