Hive Data выбирает последнее значение на основе метки времени

У меня есть таблица со следующими столбцами.

C1,C2,Process TimeStamp,InsertDateTimeStamp
p1,v1,2014-01-30 12:15:23,2013-10-01 05:34:23 
p1,v2,2014-01-31 05:11:34,2013-12-01 06:12:31 
p1,v3,2014-01-31 07:16:05,2012-09-01 07:45:20 
p2,v4,2014-02-01 09:22:52,2013-12-01 06:12:31 
p2,v5,2014-02-01 09:22:52,2012-09-01 07:45:20

Теперь я хочу получить уникальную строку для каждого первичного ключа на основе последних Process TimeStamp.

Если Process TimeStamp совпадает, то следует выбрать строку с последним InsertDateTimeStamp.

Итак, мой результат должен быть.

p1,v3,2014-01-31 07:16:05,2012-09-01 07:45:20 
p2,v4,2014-02-01 09:22:52,2013-12-01 06:12:31

Как добиться этого с помощью HiveQL?

В настоящее время я использую улей 0.10. Я не могу использовать подзапрос с IN или EXISTS.

Спасибо.


person jigarshah    schedule 05.02.2014    source источник


Ответы (2)


select C1, s.C2, s.ProcessTimeStamp, s.InsertDateTimeStamp from (
  select C1, max(named_struct('unixtime', unix_timestamp(ProcessTimeStamp, 'yyyy-MM-dd HH:mm:ss'), 'C2', C2, 'ProcessTimeStamp', ProcessTimeStamp, 'InsertDateTimeStamp', InsertDateTimeStamp)) as s
  from my_table group by C1
) t;

Выполнение max структуры сравнивается по первому полю, затем по второму полю и т. д. Таким образом, если вы создаете все вместе, сначала с анализируемым значением метки времени, вы получаете структуру, представляющую эту строку. Затем просто удалите его структуру, выбрав отдельные поля.

person Joe K    schedule 06.02.2014

Вам следует серьезно подумать об обновлении Hive, это можно легко сделать с помощью оконной функции, включенной в Hive 11+, с использованием row_number (раздел по порядку c1 по описанию ProcessTimeStamp) во вложенном выборе и выборе первой строки во внешнем выборе.

Вам не нужно обновлять весь кластер, чтобы обновить Hive, вы можете просто развернуть его на одном узле.

person Carter Shanklin    schedule 06.02.2014