大数据去重
来源:互联网 发布:记事本软件下载 编辑:程序博客网 时间:2024/04/28 23:15
其实本质上是个Map/Reduce问题,用hash函数把5G的源文件拆成若干个小文件(map过程),然后把这些hash值相同的临时文件做去重处理,最后把结果汇总(Reduce过程)
公司获取了大量url,肯定是超过内存了,按行存放,现在目的想剔除重复的数据
比如:一个5G 的txt 文件,url 一行一行的存放,而我们的内存只限制1G
我当时首先考虑分拆文件,然后hash,然后想排序比较,当时没想到好的办法,这里先说第一种:
方案一:
1.拆分文件,A B C D E,
条件:
1.保证每个文件读取小于内存限制1G,这样会分成5个文件
2.拆分的时候,按行读取,可以用TreeSet 集合去除重复,并且并且排序,然后在接近内存容量的时候输出到文件
结果:分割成5个左右的1G,并且排好序,且单个文件url不重复
2 . 这时候获得的文件,我们可以假设内容为,数字代替url
A B C D E
2 4 2 6 17
4 6 3 16 27
6 8 4 26 37
7 17 5 36 47
这时候就行合并、排序,。因为都是都大到小,或者相反的顺序,因此可以从头开始读取,假设我们1G内存,只能装10W行 url.那么合并读取
执行:
分别从读取A,B,C,D,E 第一行开始2,4,2,6,17,那么读取第一行之后,去重复,排序之后是:
A1:2,4,6,17
这里的操作方式应该比较多,我选择的的是最小数优先的原则,第一次取值A1,已经选择,发现 2,是最小的,并且是从A,C 文件中诞生的,那么第二次选择 我会从A,C的第二行开始选择,分别是4,3.这里4会被踢出,3,保留,这是A1:2,3,4,6,17
因为3是从C提取的,然后从C的第三行开始,获得4,重复,然后继续获得5,然后放入
A1:2,3,4,5,6,16
这时候发现从C中获得的5 大于从A的第二行的4,以及B中获得的4.(这里要跟新每个文件最后一次读取过的值,方便比较),然后继续读取A,B下一行:6和6 ,踢出,继续下一行7,8。然后加入
A1:2,3,4,5,6,7,8,17
然后现在的7 大于 D中的6,就从D的下一行开始,获得16,然后同样的方式,重复的踢出,然后找到最小的值,从该值的下一行读取,知道A1文件 有1G,开始第二个文件
思路:以文件行为单位,以最小的值,为方向,不断向下查找,重复就继续,否则添加,最后以相同的方式多个文件合并,最后就会形成不重复的,排序好的url 文件集合。当然这里可以像我一样选择多个文件同时进行,也可以选择 两个进行。
如果有N个内存或者服务器,那么可以分配进行,也就是说像管理员找书那样,将书分成很多部分,然后每一部分都由一个人负责查找,然后将结果送到中间的一个人进行处理,这样效率肯定是比较高的,这样的方式无论是查找,去重 都很 好,应该是分布式的应用,多个服务器运作,中间件通知反馈消息。
小结:
1.整个思路可能没有动态的图,还有的模糊,有什么不好的地方,请大家指点,有更好的方法,欢迎大家推荐。
2.这里用的Set的不存重复元素的特性,也是hash的比较,还有自带排序的功能,当然排序方式可以自己写,快排的效率很高,但是注意深度问题,无规则的数据很好。
- 大数据去重
- oralce 大数据去重
- 大数据排序 去重相关问题
- 大数据文本相似去重方案
- 大数据操作:删除和去重
- 【大数据】大数据排序或取重或去重相关问题
- 海量数据去重的五大策略
- SimHash-大数据文本去重的方法之一
- 大数据去重,你还在发愁吗?
- 【大数据技巧】MaxCompute优化去重计算的性能
- MapReduce+HDFS,海量数据去重的五大策略
- 词典去重数据
- hadoop-数据去重
- hive 去重数据
- SQL数据去重
- 数据去重
- 数据去重
- 数据去重程序
- zookeeper分布式部署方案
- 排序算法(二)
- Python:异常处理
- Java TreeMap工作原理及实现(一)
- MFC笔记-SDI窗口创建过程总结
- 大数据去重
- 欢迎界面动画效果的简单实现
- django访问sqlserver2000——使用django-pyodbc
- JAVA并发编程--ExecutorService与CompletionService
- C++第10/11周项目 继承与派生 【项目1 - 点-圆-圆柱类族的设计】(复习新版)
- 使用java向MySQL存储图片遇到的问题及解决
- Android ScrollView listview 自定义listview导致低配置手机卡死现象
- 升级Xcode导致插件失败的解决办法
- Android ButterKnife注入框架 使用