举个例子:第一次传入了100万条数据,第二次传入了200万条数据,而第二次传入的数据中包含了第一次的数据,同时在前100W条数据中有100条数据修改,现在我不知道100万的数据中有哪几条数据修改,怎么进行更新的时候,准确的找到修改和增加的数据进行更新,而不是全量更新?
(提示:我们不知道哪些数据是新更新,只有内容)
求个解决方案或思路……
大数据里面一般都没有修改和删除这个动作,其实都是插入数据,我们可以设置一个版本号,插入实现修改:如前100w条数据有一条,我们假设是数据A,数据A的内容是(id=1,name=张三,v=1(版本1)),
当你第二插入要修改数据数据A时,只需要再次插入A(id=1,name=李四,v=2);而客户端读写的时候你可以设置每次读写最新的版本,这样就实现了修改;其实主要是控制这个版本号来修改;
有个方法能解决,不过有几个前提
1.一批数据是一个整体文件,且记录按行存储
2.上一次导入的数据文件需要留存
3.下一次需要导入的文件分成2部分,第一部分为上一次的数据并且修改过后的文件,第二部分是新增的数据,这2个部分需要是2个独立的文件
如果满足以上要求,那么可以这么做
新增的照常导入
拿修改的数据文件A跟上一次导入的文件B进行比对
算法如下:
先分别整体摘要,比对摘要,一致则抛弃前者
不一致则分别将2个文件按行从中间分割成A1A2B1B2
然后分别将A1B1,A2B2比对摘要,抛弃摘要相同的分段,将剩余的继续如此分割,以此类推
直到分段只有一行为止,这样可以以最快的速度定位到修改的位置
PS:不一定要实际分割,可以通过控制行号来选定范围
整个算法可以使用递归实现,如果机器性能强劲,可以从一开始就将文件分割成若干个段来做,CPU支持几个线程就分割几个文件断
再扩展下,可以使用多台设备进行计算
本算法比较考验CPU和IO性能
更新时如果有唯一标识的话可以先查询数据是否存在,不存在直接新增,存在则根据唯一标识查出数据对比差异,有差异就更新,无差异就不做任何操作
百万的数据量,直接用数据库处理好了。对于判断的数据列,建个索引,插入数据的时候判断一下
具体的最佳解决方案,取决于你的实际情况。
比如,
1、第二次导入时能够按照第一次的顺序导入,那么直接进行按照顺序比较,对于差异部分进行更新,相同部分不更新即可。
2、数据量总量在1千万以下,用楼上的数据库处理机制直接处理。
3、前面的100万的导入时间比较短,或者成本比较低,都可以接受,就可以全清掉,重新倒,而不需要判断以前有什么数据。
等等等等。