您现在的位置是:主页 > 数据库技术 > 数据库技术

如何用mapreduce得到top最大的前n条记录

IDCBT2021-12-24服务器技术人已围观

简介这篇文章主要介绍“如何用mapreduce得到top最大的前n条记录”,在日常操作中,相信很多人在如何用mapreduce得到top最大的前n条记录问题上存在疑惑,小编查阅了各式资料,整理出简单好用

这篇文章主要介绍“如何用mapreduce得到top最大的前n条记录”,在日常操作中,相信很多人在如何用mapreduce得到top最大的前n条记录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用mapreduce得到top最大的前n条记录”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    在最初接触mapreduce时,top n 问题的解决办法是将mapreduce输出(排序后)放入一个集合中,取前n个,但这种写法过于简单,内存能够加载的集合的大小是有上限的,一旦数据量大,很容易出现内存溢出。
    今天在这里介绍另一种实现方式,当然这也不是最好的方式。

    需求,得到top最大的前n条记录
    这里只给出一些核心的代码,其他job等配置的代码略

Configuration conf = new Configuration();
conf.setInt("N", 5);

    初始化job之前需要 conf.setInt("N",5); 意在在mapreduce阶段读取N,N就代表着top N
    以下是map
 

package com.lzz.one;
import java.io.IOException;
import java.util.Arrays;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;


/**
 * topN
* 	#orderid,userid,payment,productid
* [root@x00 hd]# cat seventeen_a.txt
* 1,9819,100,121
* 2,8918,2000,111
* 3,2813,1234,22
* 4,9100,10,1101
* 5,3210,490,111
* 6,1298,28,1211
* 7,1010,281,90
* 8,1818,9000,20
* [root@x00 hd]# cat seventeen_b.txt
* 100,3333,10,100
* 101,9321,1000,293
* 102,3881,701,20
* 103,6791,910,30
* 104,8888,11,39
 
* 预测结果:(求 Top N=5 的结果)
* 1	9000
* 2	2000
* 3	1234
* 4	1000
* 5	910
 * @author Administrator
 *
 */
public class TopNMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable>{
    int len;
    int top[];
    @Override
    public void setup(Context context) throws IOException,InterruptedException {
        len = context.getConfiguration().getInt("N", 10);
        top = new int[len+1];
    }
 
    @Override
public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {
    String line = value.toString();
    String arr []= line.split(",");
    if(arr != null && arr.length == 4){
        int pay = Integer.parseInt(arr[2]);
        add(pay);
    }
}


public void add(int pay){
    top[0] = pay;
    Arrays.sort(top);
}
 
@Override
public void cleanup(Context context) throws IOException,InterruptedException {
    for(int i=1;i<=len;i++){
        context.write(new IntWritable(top[i]),new IntWritable(top[i]));
    }
 }
 
}

标签:

很赞哦! ()

本栏推荐