如何排除在同一 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 上的数据中创建循环的记录?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过同一空手道命令行上的标签包含和排除

是否可以在同一端口上的 HTTP 中创建另一个端点?

如何在Glassfishv4上的另一个Servlet中创建的Servlet中恢复会话?

如何在LINQ-To-SQL中排除Contex.InsertOnSubmit()上的用户定义字段?

如何在 plotly 中覆盖同一图中的两个图(在 plotly 中创建帕累托图)?

如何从已分析的排除文件中删除SonarQube上的问题?