Найти разницу временных меток в столбце на основе другого столбца в Hive - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть таблица, подобная приведенной ниже, в Hive.

Я хочу вычислить разницу во времени в seconds для столбцов, где id совпадает, и получить значение в столбце time_diff.

Table

+-----+---------+------------------------+-----------+
| id  |  event  |            eventdate   |time_diff  |
+-----+---------+------------------------+-----------+
| 1   | sent    | 2017-11-23 03:49:59.0  | 0         |
| 2   | sent    | 2017-11-23 04:49:59.0  | 0         |
| 1   | click   | 2017-11-24 03:49:50.0  | NULL      |
+-----+---------+------------------------+-----------+

expected result

+-----+---------+------------------------+-----------+
| id  |  event  |            eventdate   |time_diff  |
+-----+---------+------------------------+-----------+
| 1   | sent    | 2017-11-23 03:49:59.0  | 0         |
| 2   | sent    | 2017-11-23 04:49:59.0  | 0         |
| 1   | click   | 2017-11-24 03:49:50.0  | 86391     |
+-----+---------+------------------------+-----------+

Я сделал, как показано ниже вручную

SELECT (unix_timestamp('2017-11-24 03:49:50.0') - unix_timestamp('2017-11-23 03:49:59.0'));

Я получаю значениекак 86391, но я не могу понять, как это сделать, когда оба id одинаковы

Как получить ожидаемый результат

edit

+-----+---------+------------------------+-----------+
| id  |  event  |            eventdate   |time_diff  |
+-----+---------+------------------------+-----------+
| 1   | sent    | 2017-11-23 03:49:50.0  | 0         |
| 1   | sent    | 2017-11-23 03:49:59.0  | 0         |
| 2   | sent    | 2017-11-23 04:49:59.0  | 0         |
| 1   | click   | 2017-11-24 03:49:50.0  | NULL      |
+-----+---------+------------------------+-----------+

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

В значительной степени дублирует предыдущий ответ, но я думаю, что стоит выделить руководство: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics

CREATE TABLE test (id INT, event VARCHAR(8), eventdate timestamp);
INSERT INTO test VALUES (1, 'sent', '2017-11-23 03:49:50.0');
INSERT INTO test VALUES (1, 'sent', '2017-11-23 03:49:59.0');
INSERT INTO test VALUES (2, 'sent', '2017-11-23 04:49:59.0');
INSERT INTO test VALUES (1, 'click', '2017-11-24 03:49:50.0');

SELECT
    id
,   event
,   eventdate
,   CASE WHEN event = 'sent'
    THEN 0
    ELSE
        unix_timestamp(eventdate) - MIN(unix_timestamp(eventdate))
            OVER (PARTITION BY id)
    END AS time_diff
FROM test;

+------+-------+---------------------+-----------+
| id   | event | eventdate           | time_diff |
+------+-------+---------------------+-----------+
|    1 | sent  | 2017-11-23 03:49:50 |         0 |
|    1 | sent  | 2017-11-23 03:49:59 |         0 |
|    1 | click | 2017-11-24 03:49:50 |     86400 |
|    2 | sent  | 2017-11-23 04:49:59 |         0 |
+------+-------+---------------------+-----------+

Я пошел MIN(), основываясь на опыте с такого рода данными о контактах / ответах и ​​вероятности множественных событий щелчка, и предположении, что time_diff должно быть относительно исходного отправленного события. Очевидно, что функция управления окнами может быть отрегулирована по мере необходимости.

0 голосов
/ 12 сентября 2018

Вы можете попробовать использовать LAG с оконной функцией, чтобы сделать это.

Схема (MySQL v8.0)

CREATE TABLE T(
  id int,
  event varchar(50),
  eventdate datetime
);




insert into T values (1,'sent', '2017-11-23 03:49:59.0');
insert into T values (2,'sent', '2017-11-23 04:49:59.0');
insert into T values (1,'click', '2017-11-24 03:49:50.0');

Запрос № 1

SELECT *, 
   coalesce(unix_timestamp(eventdate) - unix_timestamp(LAG(eventdate) OVER(PARTITION BY ID ORDER BY eventdate)),0) time_diff
FROM T;

| id  | event | eventdate           | time_diff |
| --- | ----- | ------------------- | --------- |
| 1   | sent  | 2017-11-23 03:49:59 | 0         |
| 1   | click | 2017-11-24 03:49:50 | 86391     |
| 2   | sent  | 2017-11-23 04:49:59 | 0         |

Посмотреть на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...