原文链接:BAT直通车-海量数据专题
更多精彩内容(BAT招聘、笔试、面试、技术),请访问BAT直通车
题目
问题一:现有海量日志数据,要提取出某日访问百度次数最多的那个IP(可以将题干简化,假设日志中仅包含IP数据,也就是说待处理的文件中包含且仅包含全部的访问IP,但内存空间有限,不能全部加载,假设只有512MB)
解决方案:
这是一道典型的分治思想的题目,这种问题处理起来套路比较固定,对于大部分的数据量比较大的前提的问题而言,分治都是一个可选的解决方案,但不一定是最优的,解决方法基本划分为三步走:
第一:如何有效的划分数据
第二:如何在子集上解决问题
第三:如何合并结果
那么对于本问题就显得比较明显了:
首先解决如何划分,由于IP地地址范围从000.000.000.000~255.255.255.255共有2^32个大约4GB,那么我们可以通过取模的方式进行划分,直接将四段数据相连就得到一个IP对应的数字A,再对A模1024(模数取多少可以自己指定,保证每个小文件能被放到内存就好),这样大文件被划分成小文件了,并且相同的IP一定被划分到相同的文件中。
其次解决每个小文件中TOP1的问题:
这里可以用很多方式进行处理,比如你可以构造自己的HashMap,key为IP,value为当前出现次数,最后找到value最大的Key即为当前文件中出现次数最多的IP。
最后要解决结果合并问题:
这里直接将1024个子文件的统计结果进行比较就好,不用排序,直接选择最大的一个就好。