У меня есть входной набор данных в следующем формате:
+---+--------+----------+
| id| refId| timestamp|
+---+--------+----------+
| 1| null|1548944642|
| 1|29950529|1548937685|
| 2|27510720|1548944885|
| 2|27510720|1548943617|
+---+--------+----------+
Необходимо добавить новый столбец session
со следующей логикой преобразования:
- Если
refId is null
значение сеанса истинно. - Если
id and refId are unique
, значение сеанса равно true. - Если
id and refId are not unique
и `timestamp больше, чем в предыдущей строке, значение сеанса равно true.Кроме того, разница между временными метками должна быть> 60.
+---+--------+-------+----------+
| id| refId|session| timestamp|
+---+--------+-------+----------+
| 1| null| true|1548944642|
| 1|29950529| true|1548937685|
| 2|27510720| false|1548943617|
| 2|27510720| true|1548944885|
+---+--------+-------+----------+
Я могу выполнять условия 1 и 3 отдельно, но не 2-е.
- `data.withColumn ("session", functions.when (data.col ("refId"). isNull (), true));
WindowSpec w = Window.partitionBy("id, refid").orderBy(timestampDS.col("timestamp"));
functions.coalesce(timestampDS.col("timestamp").cast("long").$minus(functions.lag("timestamp", 1).over(w).cast("long")), functions.lit(0));
Мой вопрос заключается в том, как выполнить 2-е условиеи реализовать все 3 преобразования вместе.