大資料期末考試一篇通 ---10萬條音樂專輯的資料分析

6風箏9發表於2021-06-22

資料集albums.csv包含了10萬條音樂專輯的資料。主要欄位說明如下:

  1. album_title:音樂專輯名稱
  2. genre:專輯型別
  3. year_of_pub: 專輯發行年份
  4. num_of_tracks: 每張專輯中單曲數量
  5. num_of_sales:專輯銷量
  6. rolling_stone_critic:滾石網站的評分
  7. mtv_critic:全球最大音樂電視網MTV的評分
  8. music_maniac_critic:音樂達人的評分

統計各型別專輯的滾石網站的平均評分

統計各型別專輯的銷量總數

統計每年銷售的專輯數量

統計各型別專輯的MTV平均評分

統計各型別專輯的數量

第一題 統計各型別專輯的滾石網站的平均評分

Map階段程式碼

/**
 * @author HuangShen
 * Map階段程式碼
 * @date 2021-06-21 11:09
 */
public class AlbumsPro1Mapper extends Mapper<LongWritable, Text, Text, DoubleWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] split = value.toString().split(",");
        //排除第一行
        if (!split[0].equals("id")) {
            Albums albums = new Albums(
                    Long.parseLong(split[0]),
                    Long.parseLong(split[1]),
                    split[2],
                    split[3],
                    Integer.parseInt(split[4]),
                    Integer.parseInt(split[5]),
                    Integer.parseInt(split[6]),
                    Double.parseDouble(split[7]),
                    Double.parseDouble(split[8]),
                    Double.parseDouble(split[9]));

            //k2 專輯型別 v2 評分集合
            context.write(new Text(albums.getGenre()),new DoubleWritable(albums.getRolling_stone_critic()));

        }
    }
}

Reducer階段程式碼

/**
 * @author ShuangShen
 * Reducer階段程式碼。
 * @date 2021-06-21 11:10
 */
public class AlbumsPro1Reducer extends Reducer<Text, DoubleWritable, Text, Text> {

    @Override
    protected void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
        double  count=0.0;
        int i=0;
        for (DoubleWritable value : values) {
            count+=value.get();
            i++;
        }
        DecimalFormat df = new DecimalFormat("#.00");
        context.write(key,new Text(df.format(count/i)+"分"));
    }
}

執行任務

/**
 * @author HuangShen
 * @date 2021-06-21 12:07
 */
public class AlbumsMain extends Configured implements Tool {
    public static void main(String[] args) throws Exception {

        Configuration configuration = new Configuration();
        int run = ToolRunner.run(configuration, new AlbumsMain(), args);
        System.out.println("統計完成 請到 http://localhost:50070/explorer.html#/albums_out 進行下載");
        System.exit(run);
    }
    @Override
    public int run(String[] strings) throws Exception {
        //1 建立一個job 任務物件
        Job job = Job.getInstance(super.getConf(), "Albums");
        //防止 jar 包執行出錯
        job.setJarByClass(AlbumsMain.class);
        // 2 配置Job 任務物件 (8個步驟)
        job.setInputFormatClass(TextInputFormat.class);
        //第一步:指定Map 檔案的讀取方式 和讀取路徑
        TextInputFormat.addInputPath(job, new Path("hdfs://10.158.83.240:9000/albums_input"));
        //第二步 指定Map 階段的處理方式和資料型別
        System.out.println("請選擇抽到的題目:");
        System.out.println("1)\t統計各型別專輯的滾石網站的平均評分:");
        System.out.println("2)\t統計各型別專輯的銷量總數。:");
        System.out.println("3)\t統計每年銷售的專輯數量。:");
        System.out.println("4)\t統計各型別專輯的MTV平均評分。:");
        System.out.println("5)\t統計各型別專輯的數量。:");
        System.out.println("請輸入題號:");
        Scanner scanner = new Scanner(System.in);
        String num  = scanner.nextLine();
         switch (num){
             case "1":{
                 System.out.println("選擇了    1)\t統計各型別專輯的滾石網站的平均評分:");
                 creatJob(job, AlbumsPro1Mapper.class,Text.class,DoubleWritable.class,AlbumsPro1Reducer.class,Text.class,DoubleWritable.class);
                 break;
             }
             case "2":{
                 System.out.println("選擇了    2)\t統計各型別專輯的銷量總數。:");
                 creatJob(job, AlbumsPro2Mapper.class,Text.class, LongWritable.class, AlbumsPro2Reducer.class,Text.class,LongWritable.class);
                 break;
             }
             case "3":{
                 System.out.println("選擇了    3)\t統計每年銷售的專輯數量。:");
                 creatJob(job, AlbumsPro3Mapper.class,LongWritable.class, LongWritable.class, AlbumsPro3Reducer.class,LongWritable.class,LongWritable.class);
                 break;
             }
             case "4":{
                 System.out.println("選擇了    4)\t統計各型別專輯的MTV平均評分。:");
                 creatJob(job, AlbumsPro4Mapper.class,Text.class, DoubleWritable.class, AlbumsPro4Reducer.class,Text.class,DoubleWritable.class);
                 break;
             }
             case "5":{
                 System.out.println("選擇了    5)\t統計各型別專輯的數量。:");
                 creatJob(job, AlbumsPro5Mapper.class,Text.class, LongWritable.class, AlbumsPro5Reducer.class,Text.class,LongWritable.class);
                 break;
             }
             default:{
                 System.out.println("輸入有誤! 請輸入題號");
                 break;
             }
         }
        //第八步設定輸出型別
        job.setOutputFormatClass(TextOutputFormat.class);
        //設定輸出的路徑
        Path outputDir = new Path("hdfs://10.158.83.240:9000/albums_out");
        TextOutputFormat.setOutputPath(job, outputDir);
        //獲取檔案系統  目標檔案存在就刪除
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://10.158.83.240:9000"), new Configuration());
        if (fileSystem.exists(outputDir)) {
            fileSystem.delete(outputDir,true);
        }
        //等待任務結束
        return  job.waitForCompletion(true)?0:1;
    }
    //建立 job
     private  Job creatJob(Job job,Class<? extends Mapper> mapper,Class<?> k1,Class<?> v1,Class<? extends Reducer> reducer,Class<?> k3,Class<?> v3){
         //設定Map 階段處理方式
         job.setMapperClass(mapper);
         //設定 Map 階段K2 的資料型別
         job.setMapOutputKeyClass(k1);
         //設定 Map 階段 V2 的資料型別
         job.setMapOutputValueClass(v1);
         //第三  四 五 六 採用預設方式
         //第七步指定Reduce階段的處理方式和資料型別
         job.setReducerClass(reducer);
         //設定K3 型別
         job.setMapOutputKeyClass(k3);
         //設定V3 型別
         job.setMapOutputValueClass(v3);
        return  job;

     }
}

完整程式碼 點選下載

執行效果

相關文章