Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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 在数据集中查找Top-K记录_Java_Hadoop_Mapreduce - Fatal编程技术网

Java 在数据集中查找Top-K记录

Java 在数据集中查找Top-K记录,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,为了学习Hadoop,我正在练习《Hadoop在运行》一书中未解决的编程问题 数据集示例: 307081119631096,,“BE”,“1”,“269,6,69”,“1”,“0,,,,,,, 美国、德克萨斯州、1、2、6、63、0、,,,,,,,,, 30708319631096,,“美国”,“伊利诺伊州”,1,2,6,63,9,0.3704,,,,,,, 30708419631096,“美国”,“哦”,1,2,6,63,3,0.6667,,,,,,, 美国、加拿大、1、2、6、63、1、0、

为了学习Hadoop,我正在练习《Hadoop在运行》一书中未解决的编程问题

数据集示例:

307081119631096,,“BE”,“1”,“269,6,69”,“1”,“0,,,,,,, 美国、德克萨斯州、1、2、6、63、0、,,,,,,,,, 30708319631096,,“美国”,“伊利诺伊州”,1,2,6,63,9,0.3704,,,,,,, 30708419631096,“美国”,“哦”,1,2,6,63,3,0.6667,,,,,,, 美国、加拿大、1、2、6、63、1、0、,,,,,,, 30708619631096,,“美国”,“巴勒斯坦”,“1”,“2,6,63”,“0,,,,,,,,, 30708719631096,“美国”,“哦”,1,623,3,39,3,0.4444,,,,,,, 30780819631096,,“美国”,“IA”,“1”,“623,3,39”,“4”,“0.375,,,,,,, 30708919631096,,“美国”,“美国”,“美国”,1,4,6,65,0,,,,,,,,, 30708109631096,,“美国”,“伊利诺伊州”,1,4,6,65,3,0.4444

地图功能

public static class MapClass extends MapReduceBase implements Mapper<Text, Text, IntWritable, Text> {
        private int maxClaimCount = 0;
        private Text record = new Text();

        public void map(Text key, Text value, OutputCollector<IntWritable, Text> output, Reporter reporter) throws IOException {
            String claim = value.toString().split(",")[7];
            //if (!claim.isEmpty() && claim.matches("\\d")) {
            if (!claim.isEmpty()) {
                int claimCount = Integer.parseInt(claim);
                if (claimCount > maxClaimCount) {
                    maxClaimCount = claimCount;
                    record = value;
                    output.collect(new IntWritable(claimCount), value);
                }
//              output.collect(new IntWritable(claimCount), value);
            }
        }

    }
public static class Reduce extends MapReduceBase implements Reducer<IntWritable, Text, IntWritable, Text> {

    public void reduce(IntWritable key, Iterator<Text> values, OutputCollector<IntWritable, Text> output, Reporter reporter) throws IOException {
            output.collect(key, values.next()); 
    }
}
要求:
-根据第九列的值,从数据集中查找top-K记录(比如7)

问题:
-因为只需要7条顶级记录,所以我运行了7个map任务,并确保我获得的最高记录数为
maxClaimCount
record

-我不知道如何只收集最大记录,以便每个地图只发出一个输出


我该怎么做?

这是一个更新的答案。所有的评论都不适用于它,因为它们基于原始(不正确)答案


映射器应该只输出

output.collect(new IntWritable(claimCount), value);
没有任何比较。结果将根据索赔计数进行排序,并传递给reducer


在Reducer中,使用一些优先级队列来获取前7个结果。

这是一个更新的答案。所有的评论都不适用于它,因为它们基于原始(不正确)答案


映射器应该只输出

output.collect(new IntWritable(claimCount), value);
没有任何比较。结果将根据索赔计数进行排序,并传递给reducer


在Reducer中,使用一些优先级队列来获取前7个结果。

您可以使用TreeMap,它以排序方式存储密钥。地图绘制者将是

public Mapper() {
   TreeMap<String, String> set = new TreeMap<String, String>();
   Void map(object key, Text value){
     Set.put("get key", value);
     If(set.size > 7) {
        Set.removeFirst()
     }

   }

Public void cleanup(){
  While(Entry<string, string> entry : map.entrySet()) {
    Conetext.write(entry.key, entry.value);
  }
}}
publicmapper(){
树映射集=新树映射();
无效映射(对象键、文本值){
Set.put(“获取键”,值);
如果(设置大小>7){
Set.removeFirst()
}
}
公共空间清理(){
While(条目:map.entrySet()){
写入(entry.key,entry.value);
}
}}

您可以使用TreeMap,它以排序方式存储密钥。地图绘制者将是

public Mapper() {
   TreeMap<String, String> set = new TreeMap<String, String>();
   Void map(object key, Text value){
     Set.put("get key", value);
     If(set.size > 7) {
        Set.removeFirst()
     }

   }

Public void cleanup(){
  While(Entry<string, string> entry : map.entrySet()) {
    Conetext.write(entry.key, entry.value);
  }
}}
publicmapper(){
树映射集=新树映射();
无效映射(对象键、文本值){
Set.put(“获取键”,值);
如果(设置大小>7){
Set.removeFirst()
}
}
公共空间清理(){
While(条目:map.entrySet()){
写入(entry.key,entry.value);
}
}}

您可以使用TOPK设计模式了解更多详细信息,请参阅下面的博客

您可以使用TOPK设计模式了解更多详细信息,请参阅下面的博客

因为只有一个reduce and think,如果贴图输出的结果不足以放入内存,那么在这种情况下可能不会出现结果,对吗?每个贴图只会发出7条记录。我想你应该没事。我们怎么能这么肯定,有7个映射任务,它们可能会得到随机的数据块,因此每个分割可能会发出7条以上的记录。在当前运行中,我得到了264条记录,比49条记录多得多。您可以使用优先级队列来存储最多7条记录或类似的内容。您将在每个块中选择前7条记录。一旦你把它们放在一起,你就可以保证在它们之间的整个数据集中有前7位。因为只有一个reduce,如果映射输出的结果不足以放入内存,那么在这种情况下,结果可能不会发生,对吗?每个映射只会发出7条记录。我想你应该没事。我们怎么能这么肯定,有7个映射任务,它们可能会得到随机的数据块,因此每个分割可能会发出7条以上的记录。在当前运行中,我得到了264条记录,比49条记录多得多。您可以使用优先级队列来存储最多7条记录或类似的内容。您将在每个块中选择前7条记录。一旦你把它们放在一起,你就可以保证在整个数据集中拥有前7名。虽然这个链接可以回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能无效。