-
Notifications
You must be signed in to change notification settings - Fork 2
浅谈海量数据处理面试题
海量数据处理问题是指基于海量数据的存储与操作。而所谓的海量数据,一般是指数据量过大无法都存放在内存中和数据量过大无法在较快的时间内完成操作。
对于空间存储的问题,一般的做法就是Hash映射,把一个大文件映射成很多的小文件。对于时间的问题,一般就是设计一些巧妙的算法配合一定的数据结构来解决。
因为数据量太大,无法把所有的访问百度的IP都放到内存中,所以可以采用Hash映射的做法,把大文件映射到多个小文件中,然后每个小文件用HashMap统计。具体做法就是,对IP进行字符串Hash的时候%1000当作IP的HashCode,然后把HashCode相同的IP放在一个文件中,对于每个小文件就可以直接用HashMap统计。注意到这里HashCode相同的IP不一定相同,但HashCode不同的IP一定不同,而且一个IP对应一个HashCode,不会存在同一个IP映射到两个小文件中。
但是在这题中,这么进行Hash映射可能会出现问题。比如IP在映射到小文件的时候并不一定是均匀映射,可能有些文件还是比较大,无法放到内存里,这时候比较简单的做法是对那个文件换个Hash函数再进行Hash映射到更小的文件中。当然这个问题还有别的解决算法叫做一致性Hash算法。
如上题,如果数据量太大无法装到内存中,那么可以采用上面的Hash映射的做法,将大文件分成小文件,然后每个小文件用HashMap统计,在维护一个长度为K的优先队列去遍历这个每个小文件的HashMap得到最终的TopK。
还是如同上面的做法,Hash取模将大文件分成小文件,然后每个文件维护一个HashMap统计频率,最终维护一个优先队列,得到频数最高的词。
有两种做法。第一种就是维护一个HashMap,遍历这100个电脑,然后用一个长度为10的优先队列去遍历HashMap得到TOP10;还一种做法是先对数据进行Hash映射,将数据重新映射到这100台电脑上,然后在进行统计。
有三种种做法。第一种就如同前面对query重新Hash映射到这10个文件中,然后每个文件进行排序,最后用归并排序将10个序列合并;第二种做法是query的种类往往较少,直接用HashMap遍历所有的文件就行;第三种做法如做法一将文件重新Hash映射后用分布式文件系统来处理,再用归并排序合并。
做法还是如同之前,把大文件用Hash映射成小文件,然后对应的小文件用HashMap判断是否有相同的url。
可以将Int类型划分区间,把数放置到满足条件的区间,然后对每个区间用BitMap进行统计。
对Int进行分段,得到每段的个数,然后确定区间,和中位数是区间的第几大,然后很容易能得出结果。
采用Bitmap的做法。TODO!