阿里云大数据实战记录7:如何处理生产环境表单的重复数据

一、前言

今天发现数仓有一个表单,表里的数据出现了重复,每一列的数据都一模一样,这种情况在生产环境中是不允许出现的。于是需要想办法进行删除。

二、删除重复数据

注意:如果要对生成环境的数据表进行修改,可能需要到安全中心申请相关的表单权限。

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、新建查询窗口:

image.png

2、输入代码执行。

image.png

参考伪代码:

INSERT OVERWRITE TABLE table_name
select distinct xxx from table_name;

这个伪代码和上面的伪代码有一个本质的不同,这里操作的是同一个表,上面是不同的表,可能还包含JOINWHERE等复杂逻辑。

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),该方式本质上是先清除数据,然后再进行插入操作,我们将新插入的数据进行去重即可。这个方式可以通过调度任务来实现,也可以通过查询窗口执行代码来实现。如果只是局部的几条数据出现问题,也可以手动进行处理,只需指定删除重复数据,然后再插入一次被删除的数据即可。

猜你喜欢

转载自blog.csdn.net/qq_45476428/article/details/132332995