Java 使用某些数据类型作为MapReduce作业的输入。
我正在做一组MapReduce工作,将情节摘要列表转换为映射到电影ID的每个单词的索引,以及它被使用的次数。我有一个任务,它接受输入并创建一个节点链接列表,其中包含单词、它来自的电影以及次数。我的第二项工作是使用这个LinkedList,并使用单词作为键,使用movieID和出现次数作为值,并给出映射到它所用的每部电影的每个单词的索引以及出现次数 调用FileInputFormat.addInputPath()时,我可以使用Path()或字符串,每个元素用逗号分隔。用LinkedList保存的所有数据创建一个庞大的字符串并不困难,但是让映射程序使用LinkedList作为输入会更好Java 使用某些数据类型作为MapReduce作业的输入。,java,hadoop,mapreduce,chaining,Java,Hadoop,Mapreduce,Chaining,我正在做一组MapReduce工作,将情节摘要列表转换为映射到电影ID的每个单词的索引,以及它被使用的次数。我有一个任务,它接受输入并创建一个节点链接列表,其中包含单词、它来自的电影以及次数。我的第二项工作是使用这个LinkedList,并使用单词作为键,使用movieID和出现次数作为值,并给出映射到它所用的每部电影的每个单词的索引以及出现次数 调用FileInputFormat.addInputPath()时,我可以使用Path()或字符串,每个元素用逗号分隔。用LinkedList保存的所
我读过关于链接MapReduce作业的文章,所以请不要给我雅虎开发者页面的链接 这里不需要两个MapReduce作业(或一个LinkedList)。我们可以将其视为字数计数的一种变体,但在输出中添加一个电影ID列表 地图输入:
354757\tToys come alive
432984\tMore toys
String[] idAndWords = input.split("\\t");
for(String word : idAndWords[1].split(" ")) {
//Do whatever cleansing you want here - remove punctuation, lowercase etc.
output.write(word,idAndWords[0]);
}
("toys","354757")
("come","354757")
("alive","354757")
("more","432984")
("toys","432984")
//Maps movie IDs to occurrences
Map<String,Int> movieMap = new HashMap<>();
//In here is the list of movie IDs for each word
for(String val : values) {
if(!movieMap.contains(val)) {
movieMap.put(val,1);
} else {
movieMap.put(val,movieMap.get(val)+1);
}
}
output.write(NullWritable.get(),key+"\t"+movieMap);
toys\t[(3547571),(432984,1)]
come\t[(354757,1)]
alive\t[(354757,1)]
more\t[(432984,1)]
地图代码:
354757\tToys come alive
432984\tMore toys
String[] idAndWords = input.split("\\t");
for(String word : idAndWords[1].split(" ")) {
//Do whatever cleansing you want here - remove punctuation, lowercase etc.
output.write(word,idAndWords[0]);
}
("toys","354757")
("come","354757")
("alive","354757")
("more","432984")
("toys","432984")
//Maps movie IDs to occurrences
Map<String,Int> movieMap = new HashMap<>();
//In here is the list of movie IDs for each word
for(String val : values) {
if(!movieMap.contains(val)) {
movieMap.put(val,1);
} else {
movieMap.put(val,movieMap.get(val)+1);
}
}
output.write(NullWritable.get(),key+"\t"+movieMap);
toys\t[(3547571),(432984,1)]
come\t[(354757,1)]
alive\t[(354757,1)]
more\t[(432984,1)]
地图输出:
354757\tToys come alive
432984\tMore toys
String[] idAndWords = input.split("\\t");
for(String word : idAndWords[1].split(" ")) {
//Do whatever cleansing you want here - remove punctuation, lowercase etc.
output.write(word,idAndWords[0]);
}
("toys","354757")
("come","354757")
("alive","354757")
("more","432984")
("toys","432984")
//Maps movie IDs to occurrences
Map<String,Int> movieMap = new HashMap<>();
//In here is the list of movie IDs for each word
for(String val : values) {
if(!movieMap.contains(val)) {
movieMap.put(val,1);
} else {
movieMap.put(val,movieMap.get(val)+1);
}
}
output.write(NullWritable.get(),key+"\t"+movieMap);
toys\t[(3547571),(432984,1)]
come\t[(354757,1)]
alive\t[(354757,1)]
more\t[(432984,1)]
减速器代码:
354757\tToys come alive
432984\tMore toys
String[] idAndWords = input.split("\\t");
for(String word : idAndWords[1].split(" ")) {
//Do whatever cleansing you want here - remove punctuation, lowercase etc.
output.write(word,idAndWords[0]);
}
("toys","354757")
("come","354757")
("alive","354757")
("more","432984")
("toys","432984")
//Maps movie IDs to occurrences
Map<String,Int> movieMap = new HashMap<>();
//In here is the list of movie IDs for each word
for(String val : values) {
if(!movieMap.contains(val)) {
movieMap.put(val,1);
} else {
movieMap.put(val,movieMap.get(val)+1);
}
}
output.write(NullWritable.get(),key+"\t"+movieMap);
toys\t[(3547571),(432984,1)]
come\t[(354757,1)]
alive\t[(354757,1)]
more\t[(432984,1)]
现在,您不需要自定义的可写的,而且它的逻辑行数不到十几行,而我认为这是一组非常复杂的两链MR-jobs
效率扩展:
354757\tToys come alive
432984\tMore toys
String[] idAndWords = input.split("\\t");
for(String word : idAndWords[1].split(" ")) {
//Do whatever cleansing you want here - remove punctuation, lowercase etc.
output.write(word,idAndWords[0]);
}
("toys","354757")
("come","354757")
("alive","354757")
("more","432984")
("toys","432984")
//Maps movie IDs to occurrences
Map<String,Int> movieMap = new HashMap<>();
//In here is the list of movie IDs for each word
for(String val : values) {
if(!movieMap.contains(val)) {
movieMap.put(val,1);
} else {
movieMap.put(val,movieMap.get(val)+1);
}
}
output.write(NullWritable.get(),key+"\t"+movieMap);
toys\t[(3547571),(432984,1)]
come\t[(354757,1)]
alive\t[(354757,1)]
more\t[(432984,1)]
您可以通过在映射器输出中添加计数来提高效率-在当前实现中,绘图线“狗咬狗”将导致映射输出:
("dog","354757")
("eat","354757")
("dog","354757")
而您可以通过添加计数器并在输出前扫描整行,将其减少为两条记录:
("dog","354757\t2")
("eat","354757\t1")
我不想让我的示例变得更复杂、可读性更低,但它的实现应该很简单,并且应该会带来很好的性能节约。感谢您的回答,但对于我的问题,我必须计算每个不同绘图摘要的单词出现次数。例如:如果我有一个情节摘要“489373快速棕色跳跃奶牛”和“838399慢速棕色乌龟咬奶牛”,输出的一个例子是“cow\t 489373 1838399 1”,那么你在描述中根本不清楚,这是令人沮丧的,因为我在回答中付出了很多努力。我已经为所问的问题写下了正确的答案。这仍然只是我的示例的一个小改动,让它为您工作,并且仍然不需要多个MR作业或自定义可写内容。这只是对减速机逻辑的一个小改动。很抱歉造成混淆。所以要修改它,当reducer将所有的movieID添加到moviesList时,会有重复项,这意味着这个词在绘图摘要中出现了多次。所以我只需要浏览并简化电影列表。我现在更新了我的答案以确保正确-它使用哈希图来跟踪每部电影的发生情况。谢谢!如果我有足够的声誉,我会投票。