大資料期末考試一篇通 ---10萬條音樂專輯的資料分析
阿新 • • 發佈:2021-06-22
資料集albums.csv包含了10萬條音樂專輯的資料。主要欄位說明如下:
- album_title:音樂專輯名稱
- genre:專輯型別
- year_of_pub: 專輯發行年份
- num_of_tracks: 每張專輯中單曲數量
- num_of_sales:專輯銷量
- rolling_stone_critic:滾石網站的評分
- mtv_critic:全球最大音樂電視網MTV的評分
- 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;
}
}