哈姆雷特式项目文件结构

常说”一千个读者就有一千个哈姆雷特”,那么其实一千个程序员就有一千种项目文件结构.对于开发来说,没有最好的文件结构,只有最清晰的文件结构.一个项目文件给人最直观的感受—–层级明显,一目了然,能让后来者、维护者快速查看、定位所需要的资源,那么我认为那就是一个合格的文件结构.

这个问题上大家各抒己见,我就记录下自己的文件结构,重在完善.

这里写图片描述

有朋友给我说,你好歹做了一段时间项目了而且英语也还行,加上汉字是不是太low了>_<.我竟无力反驳,乖乖的贴个无汉字版的吧

这里写图片描述

其实对于经验老道的开发,这些老司机是不需要这些注释的,他们对于命名轻车熟路,但对于我这种小白来说,加一加还是有必要的,提醒自己加深印象.

这里写图片描述

对于上面的文件夹,其实千篇一律的东西也就不多叨叨,随便看看当作是茶余饭后的或者无聊时的消遣吧.
这里写图片描述

哈哈,突然发现貌似写错了个命名, Vendor ? Or Vender? ,看来平时还是得去补补英语了.

<think>好的,用户想在Hadoop平台上用MapReduce实现《哈姆雷特》的词频统计。首先,我需要回忆MapReduce的基本流程,分为Map阶段和Reduce阶段。Map阶段负责将输入数据分割成键值对,这里应该将每个单词作为键,值设为1。然后,Reduce阶段对相同键的值进行累加,得到每个单词的总次数。接下来,我需要考虑用户可能需要具体的代码示例。所以得写出Mapper和Reducer的Java代码。比如,Mapper类需要继承自Mapper类,重写map方法,处理每一行文本,拆分单词并输出。注意要处理大小写和标点符号,可能需要用正则表达式替换非字母字符,并将所有单词转为小写,避免重复统计。然后,Reducer类需要继承自Reducer,重写reduce方法,将相同单词的计数值相加。最后是Driver类,配置Job的参数,指定输入输出路径,以及Mapper和Reducer的类。用户可能还需要知道如何运行这个作业,比如打包成JAR文件,使用hadoopjar命令提交。此外,可能需要处理输入文件的路径,比如将《哈姆雷特》的文本文件上传到HDFS的输入目录,输出目录需不存在以避免冲突。还要注意Hadoop的环境配置是否正确,比如HDFS和YARN是否正常运行。另外,引用中提到的MongoDB的MapReduce示例可能和Hadoop的不同,需要指出两者的区别,但用户的问题是关于Hadoop的,所以重点应放在Hadoop的MapReduce实现上。 可能生成的相关问题包括如何处理大小写和标点,如何优化性能,如何处理停用词,或者如何扩展到其他文学作品的分析。这些都需要在回答后列出,帮助用户进一步探索。</think>### Hadoop实现《哈姆雷特》词频统计的MapReduce示例 #### 1. Map阶段 **目标**:将文本分割为单词,并输出键值对$(单词, 1)$ **代码示例**: ```java public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 替换非字母字符为空格,并转为小写 String line = value.toString().replaceAll("[^a-zA-Z]", " ").toLowerCase(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); // 输出格式:(word, 1) } } } ``` #### 2. Reduce阶段 **目标**:合并相同单词的计数 **代码示例**: ```java public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); // 累加所有相同单词的计数 } context.write(key, new IntWritable(sum)); } } ``` #### 3. Driver类配置 **作用**:定义MapReduce作业参数 **代码示例**: ```java public class WordCountDriver { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Hamlet Word Count"); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); // 输入路径 FileOutputFormat.setOutputPath(job, new Path(args[1])); // 输出路径 System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` #### 4. 运行步骤 1. 将《哈姆雷特》文本上传至HDFS: ```bash hadoop fs -put hamlet.txt /input ``` 2. 打包代码为JAR文件,提交作业: ```bash hadoop jar wordcount.jar WordCountDriver /input /output ``` 3. 查看结果: ```bash hadoop fs -cat /output/part-r-00000 ``` #### 注意事项 - **文本预处理**:示例中通过正则表达式$[^a-zA-Z]$过滤非字母字符,避免标点干扰统计[^1]。 - **性能优化**:可通过`CombineFileInputFormat`合并小文件提升处理效率[^2]。 - **扩展性**:此框架可扩展到分析其他文学作品,只需修改输入路径。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值