Как использовать рекурсивный запрос в Hive - PullRequest
1 голос
/ 16 января 2020

В нем есть пустые данные.

ID          Page            Timestamp   Sequence
Orestes     Login           152356      1
Orestes     Account view    152368  
Orestes     Transfer        152380  
Orestes     Account view    162382      2 
Orestes     Loan            162393  
Antigone    Login           152382      1
Antigone    Transfer        152390  

Я хочу изменить его, как показано ниже.

ID          Page            Timestamp   Sequence
Orestes     Login           152356      1
Orestes     Account view    152368      1
Orestes     Transfer        152380      1
Orestes     Account view    162382      2 
Orestes     Loan            162393      2
Antigone    Login           152382      1
Antigone    Transfer        152390      1

Я пытался ...

with r1
as
(select id, page, timestamp, lag(sequence) over (partition id order by timestamp) as sequence from log)
r2
as
(select id, page, timestamp, sequence from log)
insert into test1
select a.id, a.page, a.timestamp, case when a.sequence is not null then a.sequence
                                       when b.sequence is not null then b.sequence 
                                       else a.sequence
                                   end
from r1 a join r2 b on a.id=b.id and a.timestamp=b.timestamp
;
create table test2 like test1
;
with r1
as
(select id, page, timestamp, lag(sequence) over (partition id order by timestamp) as sequence from test1)
r2
as
(select id, page, timestamp, sequence from test1)
insert into test2
select a.id, a.page, a.timestamp, case when a.sequence is not null then a.sequence
                                       when b.sequence is not null then b.sequence 
                                       else a.sequence
                                   end
from r1 a join r2 b on a.id=b.id and a.timestamp=b.timestamp
;
create table test3 like test2
;
and it repeat to fill another blank until my fingers are numb...

Как сделать Я заполняю пробелы непосредственно перед предыдущими цифрами, как показано выше? Я думаю, что я должен использовать рекурсивный запрос, но не могу найти способ.

1 Ответ

1 голос
/ 17 января 2020

Рекурсивный запрос вообще не нужен.

В Hive есть две функции, которые могут вам помочь:

  • LAST_VALUE - возвращает последнее значение столбца
  • COALESCE - возвращает первые ненулевые значения

Таким образом, ваш запрос должен выглядеть следующим образом:

create table tmp_table like original_table;

insert into tmp_table
SELECT
    id, 
    page, 
    ts,
    COALESCE(sequence, 
             LAST_VALUE(sequence, TRUE) OVER(ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW))
FROM original_table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...