嗨,我想在hadoop中列出一个学习列表,以便如果我有两个文件示例:positivereview.txt和negativereview.txt,并且每个文本都有以下评论:
(positivereview.txt)
评论ID 1:电影似乎很酷,我特别喜欢它的 Action 部分。
评价ID 2 ...
评论ID 3 ...等。
(negativereview.txt)
点评ID 1:电影很烂,我看着细节, Action 还真是搞砸了。
评价ID 2 ...
评论ID 3 ...等。
我要开发的程序的输出应该是这样的(一个文件中两个txt文件的结果):
(p-positivereview.txt n- negaivereivew.txt)
我在hadoop-mapreduce-examples-2.7.3.jar上使用了这个wordcount java程序,但是它只会计算两个文档中的所有单词,不像我想要的那样分开。
我应该如何构建它,是否有必要修改hadoop-mapreduce-examples-2.7.3.jar(来自hadoop包含的库..),这样我就可以实现
谢谢
最佳答案
假设您从WordCount程序中获得了两个输出文件,则分别在pos.txt和neg.txt上运行。
我假设输出文件的结构是这样的
在2
电影3
那6
...
您需要编写另一个MapReduce程序(将输入作为先前MapReduce的输出目录),键值对应该是这样的
更新:
class PosNegMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String s_arr[] = value.toString().split("\\s");
int val = Integer.parseInt(s_arr[1]);
context.write(new Text(s_arr[0]), new IntWritable(val));
}
}
class PosNegReducer extends Reducer<Text, IntWritable, Text, Text> {
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
ArrayList<IntWritable> arls = new ArrayList<>();
for( IntWritable val : values){
arls.add(val);
}
if(arls.size()<2)
arls.add(new IntWritable(0));
String s = arls.get(0) + "p/" + arls.get(1) + "n" + System.getProperty("line.separator"); //Here, I took liberty that the word must be in both files.
Text result=new Text(s);
context.write(key, result);
}
}
更新1:
我想我误会了一些东西。因此,从第一步开始看。
1)初始文件是posReviews.txt和negReviews.txt。
2)因此,现在在这两个文件上运行WordCount MapReduce。(处理类似
标记,小写和大写字母等)
3)因此,从此MapReduce中,您将获得两个文件pos.txt和neg.txt
4)现在,PosNeg.java并使用此pom.xml使用maven构建单个jar。 Setup Maven for windows。使用Netbeans顺利完成工作(在设置项目时查看程序包名称,GroupID和其他内容)。
5)您将获得一个包含所有必需文件的jar,其名称为“PosNeg-1.0-SNAPSHOT-jar-with-dependencies”。使用命令“hadoop jar ... / PosNeg-1.0-SNAPSHOT-jar-with-dependencies.jar com.ga.posneg.PosNeg input_dir output_dir”运行此jar。
试试这个,让我知道。
关于java - 如何制作两个文件的学习列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43014678/