一、前言
今天发现数仓有一个表单,表里的数据出现了重复,每一列的数据都一模一样,这种情况在生产环境中是不允许出现的。于是需要想办法进行删除。
二、删除重复数据
注意:如果要对生成环境的数据表进行修改,可能需要到安全中心申请相关的表单权限。
2.1 调度任务中新增去重逻辑
删除重复数据是最终的目标。在实现此目标的过程中,首先需要确定导致重复数据的根本原因。经过分析和查找,发现重复数据源自于一个表单,该表的数据是通过异步处理将数据同步到一个地方,然后由业务人员提报一些信息,然后将采集的信息再回传入库,再进行预处理得来的。
如果前置位处理,需要保障数据在异步处理过程中无重复,这难以把握,所以采取后置位处理,即在源表处理层面增加了去重逻辑,具体而言,就是在源表的数据写入表中时增加关键词distinct
,以确保查询结果的去重。示例如下:
INSERT OVERWRITE TABLE table_name
select distinct xxx from t1 ……;
或通过group by
的方式去重,如
INSERT OVERWRITE TABLE table_name
select xxx from t1 …… group by xxx;
通过这种方式,我们能够有效地避免在数据处理过程中出现重复数据,从而提高数据的准确性和可靠性,减少重复数据带来的存储成本。
修改完提交、发布调度。如果不用急着使用数据,静候调度任务自动更新数据即可。
那如果急着看数据呢?那就发布后,手动重跑一次调度~~~
2.2 查询窗口中一次性去重
如果急需使用数据,你也可以创建一个查询窗口或节点,对源表进行去重处理,随后将结果覆盖写入源表。
具体操作参考如下:
1、新建查询窗口:
2、输入代码执行。
参考伪代码:
INSERT OVERWRITE TABLE table_name
select distinct xxx from table_name;
这个伪代码和上面的伪代码有一个本质的不同,这里操作的是同一个表,上面是不同的表,可能还包含JOIN
、WHERE
等复杂逻辑。
2.3 手动处理局部重复数据
如果重复的数据很少只有几条,也可以手动进行局部处理,即:先delete
,再insert
。(该操作也可以在查询窗口或 SQL 节点实现)
delete from table_name where id in(1,2);
insert into table_name(id,app_name) values(1,xx),(2,xx);
这个方案需要一个个输入数据,比较繁琐,仅适合少量的数据处理。
2.4 数据备份问题
实际执行删除的过程,如果源表不是中间表,而是最原始的表单,可能还需要多加一层备份,比如说新建一个临时的表单,复制一份数据到临时表单中,参考伪代码如下:
-- lifecycle 是表的生命周期,单位:天
create table table_name_like like table_name lifecycle 10;
注:lifecycle
是表的生命周期,非分区表自最后一次修改表数据开始计算,经过指定天后数据无改动,则会被自动回收(类似drop table
操作)。如果是分区表则是回收分区,和非分区表不同,即使分区表最后一个分区被回收了,该表也不会被删除。
当然,也可以查看相关项目的备份数据情况,如果有备份,则不用额外操作。详细查看:备份与恢复。
三、总结
在处理生产环境中的重复数据时,实际上就是要从表单中删除重复的数据,可以采用多种删除方式。比如:覆盖写入(INSERT OVERWRITE
),该方式本质上是先清除数据,然后再进行插入操作,我们将新插入的数据进行去重即可。这个方式可以通过调度任务来实现,也可以通过查询窗口执行代码来实现。如果只是局部的几条数据出现问题,也可以手动进行处理,只需指定删除重复数据,然后再插入一次被删除的数据即可。