Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用某些数据类型作为MapReduce作业的输入。_Java_Hadoop_Mapreduce_Chaining - Fatal编程技术网

Java 使用某些数据类型作为MapReduce作业的输入。

Java 使用某些数据类型作为MapReduce作业的输入。,java,hadoop,mapreduce,chaining,Java,Hadoop,Mapreduce,Chaining,我正在做一组MapReduce工作,将情节摘要列表转换为映射到电影ID的每个单词的索引,以及它被使用的次数。我有一个任务,它接受输入并创建一个节点链接列表,其中包含单词、它来自的电影以及次数。我的第二项工作是使用这个LinkedList,并使用单词作为键,使用movieID和出现次数作为值,并给出映射到它所用的每部电影的每个单词的索引以及出现次数 调用FileInputFormat.addInputPath()时,我可以使用Path()或字符串,每个元素用逗号分隔。用LinkedList保存的所

我正在做一组MapReduce工作,将情节摘要列表转换为映射到电影ID的每个单词的索引,以及它被使用的次数。我有一个任务,它接受输入并创建一个节点链接列表,其中包含单词、它来自的电影以及次数。我的第二项工作是使用这个LinkedList,并使用单词作为键,使用movieID和出现次数作为值,并给出映射到它所用的每部电影的每个单词的索引以及出现次数

调用FileInputFormat.addInputPath()时,我可以使用Path()或字符串,每个元素用逗号分隔。用LinkedList保存的所有数据创建一个庞大的字符串并不困难,但是让映射程序使用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时,会有重复项,这意味着这个词在绘图摘要中出现了多次。所以我只需要浏览并简化电影列表。我现在更新了我的答案以确保正确-它使用哈希图来跟踪每部电影的发生情况。谢谢!如果我有足够的声誉,我会投票。