Spark-функция rangeBetween до выполнения условия - PullRequest
0 голосов
/ 16 мая 2019

У меня есть набор данных в этом формате:

+-----------------------------+------------------------------------+------------+-----------------+
|     timestamp               |uuid                                |storyTopic  |Type             |
+-----------------------------+------------------------------------+------------+-----------------+
|2019-04-15 11:21:03.362 -0400|9e0f3d00-cff7-3b76-89df-0d11c0addc91|TRY1        |Draft            |
|2019-04-15 11:21:06.547 -0400|null                                |TRY1        |Draft            |
|2019-04-15 11:21:06.617 -0400|e142e9bc-6587-34e3-9042-959b624f5   |Trial12345  |Original         |
|2019-04-15 11:21:08.196 -0400|null                                |TRY1        |Draft            |
|2019-04-15 11:21:22.855 -0400|null                                |TRY1        |Draft            |
|2019-04-15 11:23:36.108 -0400|null                                |TRY1        |Draft            |
|2019-04-15 11:23:36.139 -0400|null                                |TRY1        |Draft            |
|2019-04-15 11:23:50.311 -0400|null                                |TRY1        |Draft            |
|2019-04-15 15:21:08.196 -0400|null                                |TRY1        |Draft            |
|2019-04-15 15:21:12.617 -0400|e142e9bc-6587-34e3-9042-959b624f5   |Trial12345  |Original         |
+-----------------------------+------------------------------------+------------+-----------------+

Если первая строка набора данных имеет storyTopic как TRY1,1. найдите строку, где timeDifference меньше 5 секунд и 2. uuid не равен нулю

Я попытался реализовать это следующим образом:

//create time difference column
df.withColumn("diff", functions.unix_timestamp(functions.col("timestamp")));
//create a window function for time-range
WindowSpec w = Window.orderBy("diff").rangeBetween(1L, 5L);
df.withColumn("Type", functions.when(
                (functions.rank().over(w)==1)
//checking if uuid is null
.and(functions.first("uuid").over(w).isNotNull()),
 functions.first("storyTopic").over(w)).otherwise("storyTopic");

В результате происходит игнорирование условия uuid.isNotNull()и получение данных из 2-й строки, а не из 3-й строки, которая удовлетворяет обоим условиям.

Как я могу убедиться, что functions.first() выбирает строку, в которой значение uuid не равно нулю?

...