TopK分为两种:
离线处理和实时流处理
非频率的 TopK 问题直接采用 PriorityQueue 就可以解决
频率处理的 TopK 问题分为 离线 和 在线 两种情形
离线处理
采用 HashMap 统计频率,对频率和单词构成的 Pair 类采用 PriorityQueue 进行计算
离线处理可能会到 速度不够快 和 内存空间不够 两种问题
速度不够快可以采用 MapperReduce 进行拆分将相同 key 合并的方式分别在每台机器上分别求出 topK,然后对各个结果采用 K 路归并算法进行合并即可
内存空间不够可能是这样一种情形:如果文件很大,即使采用 MapReduce 拆分到各个机器上去,但每台机器的内存依旧不够,这样情况下我们采用对 key 进行 hash 处理然后模上一个小于内存的数,这样比如有10万个单词分配到这个机器,算完 hash 值后再模 20000, 这样就把 key 的大小控制到了一个相对小一些的范围。但是这样可能会有一个问题,不同的 key 模完的值可能会一样,这样在统计频率时可能会出现不同的 key 累加到同一个计数上去了,也就是所谓的扎堆情况,所以我们需要在计算同一 key 的 hash 值时采用不同的大小,比如计算第一个 hash 采用 31,第二个采用 32,第三个采用 33,这样一个 key 实际上计算出了三个 hashcode,三个 hashcode分别统计次数,我们在读取频率时选取三个 hashcode 中频率最小的那个作为参考,如果三个 hashcode 都能出现扎堆问题,那可能是 20000 取的太小了
网友评论