Как исключить запись, которая создает цикл в данных на одном и том же start_dt? - PullRequest
0 голосов
/ 19 октября 2019

Для идентификации цикла я могу сделать select * from input A join input B on A.prv=B.cur and A.cur=B.prv, но как сохранить только одну запись в цикле, имеющую одинаковый start_dt? За исключением Prv и curr все столбцы для этих записей одинаковы. Я использую spark sql / Hive

Input

prv  cur  start_dt
A     B   2099-12-31
B     A   2099-12-31
P     Q   2018-12-31
Q     P   2018-12-31

Output (any of one record in cycle)
prv  cur  start_dt
A     B   2099-12-31
P     Q   2018-12-31

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Если у вас нет записи Prv = Cur (например, A, A, 2099-12-31, то вы можете использовать:

    SELECT * FROM input A 
    JOIN input B ON A.prv=B.cur AND A.cur=B.prv
    WHERE A.prv > B.prv
0 голосов
/ 19 октября 2019

На основе ваших входных данных вы можете сделать:

select i.*
from input i
where i.prv < i.cur;

В более общем случае, если у вас нет дубликатов для всех пар:

select i.*
from input i
where i.prv < i.cur
union all
select i.*
from input i
where i.prv > i.cur and
      not exists (select 1
                  from input i2
                  where i2.prv = i.cur and
                        i2.cur = i.prv and
                        i2.start_dt = i.start_dt 
                 );

Или вы можете использовать row_number():

select i.*
from (select i.*
             row_number() over (partition by start_dt, least(prv, cur), greatest(prv, cur) order by start_dt) as seqnum
      from input i
     ) i
where seqnum = 1;

Это может быть самый эффективный метод в Hive.

...