2017-02-07 12 views
1

У меня есть сценарий, где мне нужно выбрать наибольшее значение в строке из трех столбцов, есть функция Greatest, но она не работает в моей версии Улья 0.13.Извлеките столбец с максимальным значением для строки в Hive

Пожалуйста, предложите лучший способ его достижения.

Пример таблицы:

+---------+------+------+------+ 
| Col1 | Col2 | Col3 | Col4 | 
+---------+------+------+------+ 
| Group A | 1 | 2 | 3 | 
+---------+------+------+------+ 
| Group B | 4 | 5 | 1 | 
+---------+------+------+------+ 
| Group C | 4 | 2 | 1 | 
+---------+------+------+------+ 

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

+---------+------------+------------+ 
| Col1 | output_max | max_column | 
+---------+------------+------------+ 
| Group A | 3   | Col4  | 
+---------+------------+------------+ 
| Group B | 5   | col3  | 
+---------+------------+------------+ 
| Group C | 4   | col2  | 
+---------+------------+------------+ 

ответ

3
select col1 
     ,tuple.col1    as output_max 
     ,concat('Col',tuple.col2) as max_column 

from (select Col1 
       ,sort_array(array(struct(Col2,2),struct(Col3,3),struct(Col4,4)))[2] as tuple 
     from t 
     ) t 
; 

sort_array (массив)
Сортирует входной массив в порядке возрастания в соответствии с естественным упорядочением элементов массива и возвращает его (начиная с версии 0.9.0). https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF


hive> select col1 
    >  ,tuple.col1    as output_max 
    >  ,concat('Col',tuple.col2) as max_column 
    >  
    > from (select Col1 
    >    ,sort_array(array(struct(Col2,2),struct(Col3,3),struct(Col4,4)))[2] as tuple 
    >   from t 
    >  ) t 
    > ; 
OK 
Group A 3 Col4 
Group B 5 Col3 
Group C 4 Col2 
+0

Дуду, спасибо за вашу помощь, а также для форматирования таблицы в этом вопросе. У меня есть быстрый уточняющий вопрос, если кортеж будет работать в сценарии, если col2,3,4 - это дата вместо целого числа в приведенном выше примере? пожалуйста, предложите – user3273269

+0

да, он должен работать (Даты в улье находятся в формате INO YYYY-MM-DD) –