У меня есть набор данных в этом формате:
+-----------------------------+------------------------------------+------------+-----------------+
| 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 не равно нулю?