2014-10-09 2 views
3

У меня есть таблица в Hive с 5 столбцами, т. Е. Электронная почта, a_first_date, b_first_date, c_first_date, d_first_date.Hive (поиск минимального количества n столбцов в строке)

a, b, c, d - это 4 различных действия, которые пользователь может принять, и 4 столбца в таблице выше указывают дату, когда пользователь выполнил первое соответствующее действие. Например, значение в 'a_first_date' имеет дату, когда пользователь выполнил действие a.

Выход: то, что я хочу, состоит из двух столбцов, имеющих электронную почту, total_first_date i.e. В какой момент пользователь выполнил свое первое действие?

Пример таблицы: (Предположим, что все значения BIGINT типа, кроме электронной почты)

электронная почта, a_first_date, b_first_date, c_first_date, d_first_date
аЬс, 20140707,20140702,20140801,20140907
XYZ, 20140107,20140822, 20140201,20141007

Выход:

электронная почта, overall_first_date
азбука, 20140702
хуг, 20140107

Возможная пара решений заключается в том, чтобы написать UDF или сравнить эти значения друг с другом с использованием IF ELSE, а затем найти минимум, но это будет связано с большим количеством сравнений.

В качестве альтернативы я могу сделать:

select email, min(action) as overall_first_date from 

(
select email, a_first_date as action from mytable 
UNION ALL 
select email, b_first_date as action from mytable 
UNION ALL 
select email, c_first_date as action from mytable 
UNION ALL 
select email, d_first_date as action from mytable 
) q1 

GROUP BY email 

, но опять же это не является хорошим способом.

Может ли кто-нибудь предложить лучший способ достичь этого?

+0

Смотрите этот вопрос: http://stackoverflow.com/questions/7598150/get-the-minimum-value-between-several-columns – programmer43229

ответ

4

Вы можете использовать функции массива улья:

select email, 
     sort_array(array(a_first_date, b_first_date, c_first_date, d_first_date))[0] as overall_first_date 
from table; 

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

+0

Это, конечно, далеко аккуратнее, чем CASE. Потрясающие! – Espanta

2

Используйте функцию наименьшее(). Например, Выберите *, наименее (col1, col2, col3) в качестве minofcol из Tablename;

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