Заполните предыдущее значение, используя инструкцию case в Hive
У меня есть колонка event
в Hive
таблица как ниже.
Event
Sent
Sent
Open
Open
Click
Sent
Open
Signup
Sent
Open
Click
Теперь я хочу создать новый столбец на основе значений в event
столбец с использованием оператора case.
Я хочу, чтобы там, где есть signup
в столбце событий я хочу Previous_event
столбец, чтобы быть точно preceding
значение.
Я пытался, как показано ниже.
select event,
case when event = 'Sent' then 'No_event'
when event = 'Open' then 'Sent'
when event = 'Click' then 'Open'
else -1
end as Previous_event
from table;
Result
Sent No_event
Sent No_event
Open Sent
Open Sent
Click Open
Sent No_event
Open Sent
Signup -1
Sent No_event
Open Sent
Click Open
Expected result
Sent No_event
Sent No_event
Open Sent
Open Sent
Click Open
Sent No_event
Open Sent
Signup Open
Sent No_event
Open Sent
Click Open
Как я могу достичь того, чего хочу?
2 ответа
Решение
Ниже приведены URL-адреса, содержащие похожие проблемы / решения:
Улей доступа к предыдущему значению строки
https://community.hortonworks.com/questions/39533/fill-null-with-previous-row-values-in-hive.html
SQL будет:
select event, prev_event(event) as Previous_event from table;
Код для UDF:
import org.apache.hadoop.hive.ql.exec.UDF;
public class cum_mul extends UDF {
private String prevValue = null;
public String evaluate(String value) {
switch(value)
{
case "Sent":
prevValue = "No_event";
return "No_event";
case "Open":
prevValue = "Sent";
return "Sent";
case "Click":
prevValue = "Open";
return "Open";
default:
return prevValue;
}
}
}
Используйте коррелированный подзапрос.
Основываясь на комментариях ОП, вы можете попробовать следующий запрос (для MySQL):
select t1.event,
case when t1.event = 'Sent' then 'No_event'
when t1.event = 'Open' then 'Sent'
when t1.event = 'Click' then 'Open'
when t1.event = 'Signup' then (select t2.event
from table as t2
where t2.eventdate < t1.eventdate
order by t2.eventdate desc
limit 1)
else -1
end as Previous_event
from table as t1;