У меня есть столбец 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

Как я могу достичь того, чего хочу?

1
nmr 25 Сен 2018 в 21:46

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; 
        } 
      }
}
1
Harneet Singh 26 Сен 2018 в 05:47

Используйте коррелированный подзапрос.

Основываясь на комментариях OP, вы можете попробовать следующий запрос ( для 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;
2
Madhur Bhaiya 25 Сен 2018 в 19:13