海量数据处理面试常见

海量数据处理,一般是指由于内存限制,无法将全部数据一次性导入内存当中,采用的处理方案。一般常见的有统计海量数据重复次数最多的元素,最大/最小的N个元素,重复次数最多的N个元素,两个大文件有交集的数据等

常用的工具有hash分治,tries树统计频率,最小堆找出前N大和bit-map是否出现等

海量日志数据,找出IP最多的一个

对1000取模,将其均匀的分成1000个小文件,对每个文件使用hashMap找出出现最多的一个ip,在比较这1000个IP,找出次数最多的。

一个大文件,文件每行都是长度有限单词,返回出现次数最多的100个单词

  1. 对1000取模,将大文件分成1000个小文件,相同单词肯定会被分到同一个小文件

  2. 针对每一个小文件,使用tries/或hashMap,统计每个单词出现的次数

  3. 建立大小为100的最小堆,遍历所有单词,频率大于堆顶元素的,抛弃堆顶元素,将新元素设为堆顶,重新调整堆的结构;否则抛弃

a,b两个文件,每个文件有50亿个url,找出两个文件共有的url

  1. 分别使用1000取模法对两个大文件中的元素取模,将其分成1000个小文件. a0,a1,…a999 和 b0,b1,…b999

  2. 分别比较a0 vs b0, a1 vs b1, … a999 vs b999, 使用hashSet统计两个小文件的相同元素

2.5亿个数,找出其中不重复的数

采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,内存还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。

给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中

申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序

顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。 找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。

对这10个文件进行归并排序