2014-02-05 3 views
1

У меня есть таблица со следующими столбцами.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.

Спасибо.

ответ

4
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; 

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

+0

Спасибо. Работает :) – jigarshah

4

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

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

Смежные вопросы