У меня есть таблица в 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
, но опять же это не является хорошим способом.
Может ли кто-нибудь предложить лучший способ достичь этого?
Смотрите этот вопрос: http://stackoverflow.com/questions/7598150/get-the-minimum-value-between-several-columns – programmer43229