Чтобы определить цикл, я могу сделать 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
0
user2895589 19 Окт 2019 в 07:43
Если вы можете использовать Spark dataframe API, вы можете попробовать drop_duplicates, добавив временный столбец со значением sort_array(array(prv,cur)). ниже синтаксиса pyspark: df.withColumn('k', F.expr('sort_array(array(prv,cur))')).drop_duplicates(subset=['start_dt', 'k'])
 – 
jxc
20 Окт 2019 в 06:00

2 ответа

Если у вас нет записи 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
2
daShier 19 Окт 2019 в 07:58

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

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.

0
Gordon Linoff 19 Окт 2019 в 15:38