Как перебирать таблицу улья строка за строкой и вычислять метрику при выполнении определенного условия? - PullRequest
1 голос
/ 28 мая 2019

У меня есть требование, как показано ниже:

Я пытаюсь преобразовать макрос цикла таблицы MS Access для работы с таблицей улья. Таблица под названием trip_details содержит подробную информацию о конкретной поездке на грузовике. Грузовик может останавливаться в нескольких местах, и тип остановки обозначается флагом под названием type_of_trip. Этот столбец содержит значения, такие как arrival, departure, loading и т. Д.

Конечная цель состоит в том, чтобы рассчитать время задержки каждого грузовика (сколько времени занимает грузовик, прежде чем начать другую поездку). Чтобы вычислить это, мы должны перебрать таблицу строка за строкой и проверить тип поездки.

Типичный пример выглядит так:

До конца файла:

  1. Сохранить первую строку в переменной.
  2. Перейти ко второму ряду.
  3. Если type_of_trip = Прибытие:
    Перейти к третьему ряду
  4. Если type_of_trip = End Trip:
    Храните третий ряд
    Возьмите разницу временных меток для расчета времени задержки
  5. Добавить строку в выходную таблицу

Конец

Как лучше всего решать эту проблему в улье?

Я попытался проверить, содержит ли hive ключевое слово for loop, но не смог его найти. Я думал о том, чтобы сделать это с помощью сценария оболочки, но мне нужно руководство по этому вопросу.

Я не могу раскрыть все данные, но не стесняйтесь задавать любые вопросы в разделе комментариев.

Input

Идентификатор поездки type_of_trip метка времени location

1         Departure       28/5/2019 15:00      Warehouse  
1         Arrival         28/5/2019 16:00      Store  
1         Live Unload     28/5/2019 16:30      Store  
1         End Trip        28/5/2019 17:00      Store  

Ожидаемый результат

Идентификатор поездки Исходное местоположение Место назначения Время ожидания

1        Warehouse        Store                2 hours

1 Ответ

1 голос
/ 28 мая 2019

Для этого вам не нужен цикл, используйте мощность SQL-запроса.

Преобразуйте ваши метки времени в секунды (используя указанный вами формат 'dd/MM/yyyy HH:mm'), рассчитайте минимальное и максимальное значения для trip_id с учетом типа, вычтите секунды, преобразуйте разницу секунд в 'HH:mm' формат или любой другой формат, который вы предпочитаете :

with trip_details as (--use your table instead of this subquery
select stack (4,
1,'Departure'   ,'28/5/2019 15:00','Warehouse', 
1,'Arrival'     ,'28/5/2019 16:00','Store',  
1,'Live Unload' ,'28/5/2019 16:30','Store',  
1,'End Trip'    ,'28/5/2019 17:00','Store' 
) as (trip_id, type_of_trip, `timestamp`, location)
)

select trip_id, origin_location, destination_location,
       from_unixtime(destination_time-origin_time,'HH:mm') dwell_time
  from
(
select trip_id,
       min(case when type_of_trip='Departure' then unix_timestamp(`timestamp`,'dd/MM/yyyy HH:mm') end) origin_time,
       max(case when type_of_trip='End Trip'  then unix_timestamp(`timestamp`,'dd/MM/yyyy HH:mm') end) destination_time,
       max(case when type_of_trip='Departure' then location  end) origin_location,
       max(case when type_of_trip='End Trip' then location  end) destination_location
  from trip_details 
 group by trip_id
)s;

Результат:

trip_id origin_location destination_location    dwell_time  
1   Warehouse   Store   02:00   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...