如何排除在同一 start_dt 上的数据中创建循环的记录?
Posted
技术标签:
【中文标题】如何排除在同一 start_dt 上的数据中创建循环的记录?【英文标题】:How to exclude record which creates cycle in data on same start_dt? 【发布时间】:2019-10-19 04:43:18 【问题描述】:确定我可以做的循环
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
【问题讨论】:
如果您可以使用 Spark 数据帧 API,您可以通过添加一个值为sort_array(array(prv,cur))
的临时列来尝试 drop_duplicates。以下 pyspark 语法:df.withColumn('k', F.expr('sort_array(array(prv,cur))')).drop_duplicates(subset=['start_dt', 'k'])
【参考方案1】:
如果您没有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】:根据您的输入数据,您可以:
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 中最有效的方法。
【讨论】:
以上是关于如何排除在同一 start_dt 上的数据中创建循环的记录?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Glassfishv4上的另一个Servlet中创建的Servlet中恢复会话?
如何在LINQ-To-SQL中排除Contex.InsertOnSubmit()上的用户定义字段?