資料集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;
}
}