求亿级记录中搜索次数Top N的搜索词(MapReduce实现)

程序事例:

日志信息:

二手车    1345
二手房    3416
洗衣机    2789

输入: N=2

输出:
二手房
洗衣机

map函数如下:

import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class TopNMapper extends Mapper<Object, Text, NullWritable, Text> {
    private TreeMap<IntWritable, Text> tm = new TreeMap<IntWritable, Text>();
    private IntWritable mykey = new IntWritable();
    private Text myvalue = new Text();
    private int N = 10;
    @Override
    protected void map(Object key, Text value,
            Mapper<Object, Text, NullWritable, Text>.Context context)
            throws IOException, InterruptedException {
        String word = value.toString().split("\t")[0];
        int num = Integer.parseInt(value.toString().split("\t")[1]);
        mykey.set(num);
        myvalue.set(word);
        tm.put(mykey, myvalue);
        if (tm.size() > N) tm.remove(tm.firstKey());
    }

    @Override
    protected void cleanup(
            Mapper<Object, Text, NullWritable, Text>.Context context)
            throws IOException, InterruptedException {
        for (Map.Entry<IntWritable, Text> entry : tm.entrySet()) {
            Text value = new Text(entry.getKey() + " " + entry.getValue());
            context.write(NullWritable.get(), value);
        }
    }
}

Reduce函数如下:

import java.io.IOException;
import java.util.TreeMap;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class TopNReducer extends Reducer<NullWritable, Text, NullWritable, Text>{
    private TreeMap<IntWritable, Text> tm = new TreeMap<IntWritable, Text>();
    private IntWritable mykey = new IntWritable();
    private Text myvalue = new Text();
    private int N = 10;
    @Override
    protected void reduce(NullWritable key, Iterable<Text> values,
            Reducer<NullWritable, Text, NullWritable, Text>.Context context)
            throws IOException, InterruptedException {
        for (Text val : values) {
            String[] tmp = val.toString().split(" ");
            mykey.set(Integer.parseInt(tmp[0]));
            myvalue.set(tmp[1]);
            tm.put(mykey, myvalue);
            if (tm.size() > N) tm.remove(tm.firstKey());
        }
        for (Text res : tm.descendingMap().values()) {
            context.write(NullWritable.get(), res);
        }
    }
}
时间: 2024-10-15 13:58:07

求亿级记录中搜索次数Top N的搜索词(MapReduce实现)的相关文章

sphinx在亿级项目中的使用场景

不管是网站还是app很多产品的设计思路和产品功能多多少少都有相似之处,那么这边主要讲以下几个场景 描述.话题的搜索 主要的实现思路是全量索引+增量索引方式,可设定时任务定点跑索引 用户昵称的搜索 主要是实现思路是实时索引+分布式索引的方式,用户由于过多,故使用实时索引的方法进行增加,旧数据通过跑脚本重新读取后再写入. 搜索框联想词的提示 主要实现思路是分布式索引的方式,自动联想其他人曾经输入过的词语. tip: morphology = stem_en会启用英文单词的提取.搜索英文时候就不会一个

十亿级视频播放技术优化揭密

本文为转载文章,文章来自:王辉|十亿级视频播放技术优化揭密 QCon是由InfoQ主办的全球顶级技术盛会,每年在伦敦.北京.东京.纽约.圣保罗.上海.旧金山召开.自 2007年 3月份首次举办以来,已经有超万名高级技术人员参加过QCon大会.QCon内容源于实践并面向社区,演讲嘉宾依据热点话题,面向 5年以上工作经验的技术团队负责人.架构师.工程总监.高级开发人员分享技术创新和最佳实践. 4月18日性能优化面面观专题会议上,腾讯研发总监王辉以“十亿级视频播放技术优化揭秘”为主题,用QQ空间的日均

亿级日搜索量的美团如何构建高效的搜索系统?

众所周知,美团为用户提供了全方位的生活服务,包括外卖.出行.甚至是零售和生鲜等方面. 面对纷繁复杂的服务与选项,用户怎样才能快速地找到自己想要的结果呢?这就需要美团平台的搜索服务来帮忙. 2018 年 11 月 30 日-12 月 1 日,由 51CTO 主办的 WOT 全球人工智能技术峰会在北京粤财 JW 万豪酒店隆重举行. 本次峰会以人工智能为主题,来自美团的高级算法技术专家蒋前程在推荐搜索专场,从美团搜索的主要特点,以及他们是如何使用自己的算法模型去应对挑战等方面,向大家介绍<美团 O2O

【面试被虐】如何只用2GB内存从20亿,40亿,80亿个整数中找到出现次数最多的数?

这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如 [面试现场]如何判断一个数是否在40亿个整数中? [算法技巧]位运算装逼指南 对于算法题还是有点信心的,,,,于是,发现了如下对话. 20亿级别 面试官:如果我给你 2GB 的内存,并且给你 20 亿个 int 型整数,让你来找出次数出现最多的数,你会怎么做? 小秋:(嗯?怎么感觉和之前的那道判断一个数是否出现在这 40 亿个整数中有点一样?可是,如果还是采用 bitmap 算法的话,好像无法统计一个数出现的次数,只能判断一个数是

只用2GB内存在20亿个整数中找到出现次数最多的数

[题目] 有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数. [要求] 内存限制为2GB. [解答] 想要在很多整数中找到出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的key是某一个整数,value是这个数出现的次数.就本题来说,一共有20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数而不会产生溢出,所以哈希表的key需要占用4B,value也是4B.那么哈希表的一条记录(key,value)需要占用8B,当哈希表记录

Spark实战--寻找5亿次访问中,访问次数最多的人

问题描述 对于一个大型网站,用户访问量尝尝高达数十亿.对于数十亿是一个什么样的概念,我们这里可以简单的计算一下.对于一个用户,单次访问,我们通常会记录下哪些数据呢? 1.用户的id 2.用户访问的时间 3.用户逗留的时间 4.用户执行的操作 5.用户的其余数据(比如IP等等) 我们单单从用户id来说,比如10011802330414,这个ID,那么我们一个id差不多就是一个long类型,因为在大量数据存储的时候,我们都是采用文本存储.因此对于5亿个用户ID,完全存储在磁盘当中,大概是5G的大小,

数组-10. 求整数序列中出现次数最多的数

数组-10. 求整数序列中出现次数最多的数(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3

Hash——字符串匹配(求s1在s2中出现的次数)

题目描述: 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A  中的出现次数.A 和 B中的字符均为英语大写字母. 求A 在 B 中出现了几次.(可重叠) 样例输入: 3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN 样例输出: 1 3 0 首先要知道什么是字符串hash(滚动哈希): 单哈希可以O(m)的时间计算长度为m的字符串的哈希值,但对于本题,总的时间复杂度没有改观.时间会爆. 这时我们就需要一个叫做滚动哈希的优化技巧.

7-6 求整数序列中出现次数最多的数 (15 分)

7-6 求整数序列中出现次数最多的数 (15 分) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3 0 3 2 输出样例: 3 4 s = input().split()[1:] count_max = 0 for i in set(s