Как прочитать 2 или более записей в Hive UDF?

#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 или другого столбца, если это необходимо.