最近公司在做一个大数据项目的时候,数据量达到了1000w+的程度,并且还有源源不断的数据从采集上来,并需要和数据库中的数据做一系列的逻辑比对,在此就自己的实践总结下心得,欢迎批评指正。
需求:将MySQL表中的部分数据(状态为1)的数据和采集上来的新数据(状态为2)的数据根据已经设置好的唯一字段(比对规则)作对比,不重复的数据修改状态,重复数据挪到重复库中待使用,差异数据(唯一字段重复,其余字段不重复的数据)放到确认库给用户确认。
1、实体类
2、由于数据量很大,不能一次性读到内存当中,分批处理
3、关键的一步:采用group By过滤唯一字段重复的数据(条件允许可以加上索引),将查出来的数据写入临时表
createTableName:创建的临时表名称。
tableName:查询的表名称。
groupStr:group字段名,逗号间隔。
这样临时表当中的数据就都是不重复的数据了,相对应的将我们表中数据将状态修改为1就可以了,INNER JOIN 和 EXISTS都可以,在这里建议用 EXISTS,因为 EXISTS 对于命中率高的数据而言,效率会比INNER JOIN更高一点,此处命中率百分之百,故此采用
EXISTS 代替 INNER JOIN。(如果想了解两者的具体原理区别,请在下方留言)
//修改状态
4、比较差异数据和重复数据。
因为不重复数据已经被我们找出来了并且改了状态了,剩下的即为差异数据和完全重复数据,这两种数据有一个共同点:唯一字段(比对规则)是一样的,所以我们完全可以再内存中利用算法进行比较
因为很多的大数据环境下,表名字是不确定的,大多数表名字是需要服务器传递实参,如果是有实体类的比较大家可以尝试着重写compare方法和重写hashcode方法进行比较,对于没有实体类的,则可以通过先建立临时表,再分批读取到内存比较的方法进行比较,内存比较可以采用多线程的方式并发执行,这样效率应该可以提升比较多的,欢迎大家批评指正。感谢!