Spark SQL window function look ahead and complex function

I have the following data:

+-----+----+-----+
|event|t   |type |
+-----+----+-----+
| A   |20  | 1   |
| A   |40  | 1   |
| B   |10  | 1   |
| B   |20  | 1   |
| B   |120 | 1   |
| B   |140 | 1   |
| B   |320 | 1   |
| B   |340 | 1   |
| B   |360 | 7   |
| B   |380 | 1   |
+-----+-----+----+

      

And I want something like this:

+-----+----+----+
|event|t   |grp |
+-----+----+----+
| A   |20  |1   |
| A   |40  |1   |
| B   |10  |2   |
| B   |20  |2   |
| B   |120 |3   |
| B   |140 |3   |
| B   |320 |4   |
| B   |340 |4   |
| B   |380 |5   |
+-----+----+----+

      

Rules:

  1. Group all values ​​together at least 50ms apart. (column t) and belongs to the same event.
  2. When line type 7 appears, cut and delete this row. (see last row)

The first rule I can achieve with the answer from this thread is :

Code:

val windowSpec= Window.partitionBy("event").orderBy("t")

 val newSession =  (coalesce(
  ($"t" - lag($"t", 1).over(windowSpec)),
  lit(0)
) > 50).cast("bigint")

val sessionized = df.withColumn("session", sum(newSession).over(userWindow))

      

I have to say that I can't figure out how this works, and I don't know how to change this so that rule 2 also works ... Hopefully someone can give me some helpful hints.

What I have tried:

val newSession =  (coalesce(
  ($"t" - lag($"t", 1).over(windowSpec)),
  lit(0)
) > 50 || lead($"type",1).over(windowSpec) =!= 7 ).cast("bigint")

      

But only the error occurred: "Must follow method; cannot follow org.apache.spark.sql.Column val grp = (coalesce(

+3


source to share


1 answer


this should do the trick:

val newSession =  (coalesce(
  ($"t" - lag($"t", 1).over(win)),
  lit(0)
) > 50 
  or $"type"===7) // also start new group in this case
 .cast("bigint")

df.withColumn("session", sum(newSession).over(win))
.where($"type"=!=7) // remove these rows
.orderBy($"event",$"t")
.show

      



gives:

+-----+---+----+-------+
|event|  t|type|session|
+-----+---+----+-------+
|    A| 20|   1|      0|
|    A| 40|   1|      0|
|    B| 10|   1|      0|
|    B| 20|   1|      0|
|    B|120|   1|      1|
|    B|140|   1|      1|
|    B|320|   1|      2|
|    B|340|   1|      2|
|    B|380|   1|      3|
+-----+---+----+-------+

      

+2


source







All Articles