получить последние данные из таблицы кустов с несколькими столбцами разделов

У меня есть таблица улья со структурой ниже

ID string,
Value string,
year int,
month int,
day int,
hour int,
minute int

Эта таблица обновляется каждые 15 минут и разбита на столбцы год / месяц / день / час / минута. Ниже приведены примеры разделов.

year=2019/month=12/day=29/hour=19/minute=15
year=2019/month=12/day=30/hour=00/minute=45
year=2019/month=12/day=30/hour=08/minute=45
year=2019/month=12/day=30/hour=09/minute=30
year=2019/month=12/day=30/hour=09/minute=45

Я хочу выбрать из таблицы только последние данные раздела. Я попытался использовать операторы max () с этими столбцами раздела, но это не очень эффективно, поскольку размер данных огромен. Пожалуйста, дайте мне знать, как мне удобно получить данные с помощью hive sql.


person hr02    schedule 10.01.2020    source источник


Ответы (1)


Если последний раздел всегда имеет текущую дату, вы можете отфильтровать раздел с текущей датой и использовать rank () для поиска записей с последним часом, минутой:

select * --list columns here
from
(
select s.*, rank() over(order by hour desc, minute desc) rnk
  from your_table s
 where s.year=year(current_date)   --filter current day (better pass variables calculated if possible)
   and s.month=lpad(month(current_date),2,0) 
   and s.day=lpad(day(current_date),2,0)
   -- and s.hour=lpad(hour(current_timestamp),2,0) --consider also adding this
) s 
where rnk=1 --latest hour, minute

И если последний раздел не обязательно равен current_date, вы можете использовать rank() over (order by s.year desc, s.month desc, s.day desc, hour desc, minute desc), без фильтра по дате это будет сканировать всю таблицу и неэффективно.

Он будет работать лучше всего, если вы сможете вычислить фильтры разделов в оболочке и передать их в качестве параметров. См. Комментарии в коде.

person leftjoin    schedule 10.01.2020