mapreduce topN算法实现 获取前10个音乐数据

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/smallpizza/article/details/77950723

上次通过爬虫获取了音乐的数据,并把数据导入到hdfs中,根据他的点击量获取前10个音乐,测试了半天现在终于弄好了,分享一下,如有更好的思路请指教。
部分原始数据(主要用于测试)如下:
字段名说明:
音乐id^歌曲名^链接^音乐类型^歌手^专辑^点击量^收藏量
这里写图片描述
代码如下:

import java.io.IOException;
import java.net.URI;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.yarn.webapp.ForbiddenException;

import com.sun.org.apache.bcel.internal.generic.NEW;


public class MusicTopN {
    //map类
    public static class MusicTopNMapper extends Mapper<LongWritable,Text,NullWritable,Text>{
        public void map(LongWritable key,Text value,Context context){
            try {
                context.write(NullWritable.get(),new Text(value.toString()));
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static class MusicTopNReducer extends Reducer<NullWritable,Text,NullWritable,Text>{
        List<String> sortList=new LinkedList<String>();
        Map<String,Integer> map=new HashMap<String, Integer>();
        public void reduce(NullWritable key,Iterable<Text> values,Context context){
            for(Text value:values){
                //把每一行读入的数据转换为String
                String line=value.toString();
                //把里lineString安装"^"切分
                String[] subLines=line.split("\\^");
                //获取点击量
                int m_click=Integer.valueOf(subLines[6]);
                //保存到map中
                map.put(line,m_click);
            }
            //这里将map.entrySet()转换成list
            List<Map.Entry<String,Integer>> list=new LinkedList<Map.Entry<String,Integer>>(map.entrySet());
            //通过比较器来实现排序
            Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
                //降序排序
                @Override
                public int compare(Entry<String, Integer> arg0,Entry<String, Integer> arg1) {
                    return (int) (arg1.getValue() - arg0.getValue());  
                }

            }); 
//          for(Map.Entry<String,Integer> mapping:list){
//              sortList.add(mapping.getKey());
//          }
            for(int i=0;i<10;i++){
                Map.Entry<String,Integer> mapping=list.get(i);
                sortList.add(mapping.getKey());
            }   
        }

        protected void cleanup(Context context){
            int len=sortList.size();
            for(String str:sortList){
                try {
                    context.write(NullWritable.get(),new Text(str));
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /*
     * 获取topN音乐的控制方法
     */
    public void TopNMusic(){
        //设置文件输入路径
        String fileInput="/music/orgmusic.txt";
        Path fileInPath=new Path(fileInput);
        //设置文件输出路径
        //String fileOutput="/music/topnmusic";
        String fileOutput="/music/topnmusic/topten";
        Path fileOutPath=new Path(fileOutput);
        //进行配置
        Configuration conf = new Configuration(); 
        try {
            FileSystem fsIn=FileSystem.get(URI.create(fileInput),conf);
            if(!fsIn.exists(fileInPath)){
                return;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //判断输出文件是否存在,如果存在就删除
        try {
            FileSystem fs=FileSystem.get(URI.create(fileOutput),conf);
            if(fs.exists(fileOutPath)){
                fs.delete(fileOutPath);
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        try {
            //设置工作名字
            Job job = new Job(conf, "musictopn");
            //设置主jar包
            job.setJarByClass(MusicTopN.class); 
            //设置map类
            job.setMapperClass(MusicTopNMapper.class); 
            //设置reduce类
            job.setReducerClass(MusicTopNReducer.class);
            //设置输出key的类型
            job.setOutputKeyClass(NullWritable.class);  
            //设置输出value的类型
            job.setOutputValueClass(Text.class);  
            //设置文件路径
            FileInputFormat.addInputPath(job,fileInPath); 
            FileOutputFormat.setOutputPath(job,fileOutPath); 
            System.exit(job.waitForCompletion(true) ? 0 : 1); 
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }   
    }   
}

public class MusicMain {
    public static void main(String[] args) {
        /*
         * 获取topN音乐
         */
        MusicTopN musicTopN=new MusicTopN();
        musicTopN.TopNMusic();
}

运行结果如下:
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页