#hive
#улей
Вопрос:
У меня есть таблица журналов некоторых платных станций. Моя задача, «переведенная» в SQL, такова:
шаг 1. отсортируйте эти записи, используя GROUP BY station, lane .
шаг 2. упорядочьте эти записи, используя ORDER BY check_time .
шаг 3. [в этом проблема] последовательно оценивайте каждые две смежные записи в каждой группе, независимо от того, составляет ли интервал менее 5 секунд или нет.
Это легко, если я могу сделать это на C, Java или других, но не на SQL. Кажется, что Hive UDF (определяемая пользователем функция) может помочь мне в этом. Я прочитал демонстрационный UDF из официальной документации. Но все же я не знаю, как передать последовательные 2 записи в мою функцию. Любой совет?
Ответ №1:
Вы можете сделать это с помощью SQL. Используя LAG()
аналитическую функцию, вы можете получить предыдущую строку check_time
и другие столбцы, если это необходимо. Затем выполните вычисление с двумя временными метками. Преобразуйте временные метки в секунды с помощью unix_timestamp() и вычтите:
select t.*,
case when time_diff < 5 then ... else ... end --do some logic
from
(
select t.*,
--current time minus previous time
unix_timestamp(check_time) -
unix_timestamp(lag(check_time) over (partition by station, lane order by check_time)) as time_diff
from table t
) t
Lead()
Аналитическая функция для получения следующей строки check_time или другого столбца, если это необходимо.