使用MapReduce统计以'Engineering'结尾的维基百科标题数量
使用MapReduce统计以'Engineering'结尾的维基百科标题数量
本文将指导你如何使用MapReduce技术编写Java程序,统计一个名为'enwiki-20230701-pages-articles-multistream-index.txt'的1GB维基百科数据文件中,以'Engineering'结尾的标题数量。
数据格式
数据文件包含多行文本,每行格式如下:
20786444748:68815049:Engineering Science Research Organization
其中,冒号分隔的第三部分代表维基百科页面的标题。
程序目标
统计所有以'Engineering'结尾的标题数量。
实现步骤
-
创建Java项目并导入Hadoop依赖库: 创建一个新的Java项目,并将Hadoop相关的JAR包添加到项目的类路径中。
-
编写Mapper类: 创建一个继承自
Mapper类的TitleMapper类,实现map方法。该方法接收每一行文本作为输入,解析出标题,并判断是否以'Engineering'结尾。如果是,则输出键值对('<标题>,1'),其中键为标题,值为1。public class TitleMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private static final Text ENGINEERING = new Text('Engineering'); private final static IntWritable ONE = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] parts = value.toString().split(':'); if (parts.length == 3 && parts[2].endsWith(ENGINEERING.toString())) { context.write(new Text(parts[2]), ONE); } } } -
编写Reducer类: 创建一个继承自
Reducer类的TitleReducer类,实现reduce方法。该方法接收Mapper输出的键值对,对相同标题的计数值进行累加,并输出最终的统计结果(<'Engineering结尾标题数量',<数量>)。public class TitleReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int count = 0; for (IntWritable value : values) { count += value.get(); } context.write(new Text(''Engineering'结尾标题数量'), new IntWritable(count)); } } -
编写主程序: 创建一个主类,配置并运行MapReduce作业。
public class TitleCount { public static void main(String[] args) throws Exception { // 创建Job Configuration conf = new Configuration(); Job job = Job.getInstance(conf, 'Engineering Title Count'); // 设置Jar包路径 job.setJarByClass(TitleCount.class); // 设置Mapper和Reducer类 job.setMapperClass(TitleMapper.class); job.setReducerClass(TitleReducer.class); // 设置Mapper输出类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); // 设置Reducer输出类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 设置输入输出路径 FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // 运行Job System.exit(job.waitForCompletion(true) ? 0 : 1); } } -
打包JAR文件: 使用Maven或其他构建工具将项目打包成JAR文件。
-
上传JAR文件并运行: 将JAR文件上传到Hadoop集群,并使用以下命令运行MapReduce作业:
hadoop jar <JAR文件名> <主类名> <输入路径> <输出路径> -
查看结果: 作业完成后,在指定的输出路径下查看结果文件,即可获得以'Engineering'结尾的标题数量。
总结
本文详细介绍了如何使用MapReduce技术统计维基百科数据文件中以'Engineering'结尾的标题数量。通过学习本文,你可以了解MapReduce程序的基本结构和编写方法,并将其应用到实际的数据分析任务中。
原文地址: https://www.cveoy.top/t/topic/buLd 著作权归作者所有。请勿转载和采集!