Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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 复合密钥被更改,Hadoop Map Reduce?_Java_Hadoop_Mapreduce_Hadoop Partitioning - Fatal编程技术网

Java 复合密钥被更改,Hadoop Map Reduce?

Java 复合密钥被更改,Hadoop Map Reduce?,java,hadoop,mapreduce,hadoop-partitioning,Java,Hadoop,Mapreduce,Hadoop Partitioning,我刚刚开始学习hadoop,并使用自定义分区器和比较器运行hadoop map reduce程序。我面临的问题是,主排序和次排序没有在复合键上完成,更重要的是,一个复合键的部分正在被其他复合键部分更改 例如,我在mapper中创建以下关键点 key1 -> tagA,1 key2 -> tagA,1 key3 -> tagA,1 key4 -> tagA,1 key5 -> tagA,2 key6 -> tagA,2 key7 -> tagB,1

我刚刚开始学习hadoop,并使用自定义分区器和比较器运行hadoop map reduce程序。我面临的问题是,主排序和次排序没有在复合键上完成,更重要的是,一个复合键的部分正在被其他复合键部分更改

例如,我在mapper中创建以下关键点

key1 -> tagA,1 
key2 -> tagA,1 
key3 -> tagA,1
key4 -> tagA,1 
key5 -> tagA,2 
key6 -> tagA,2
key7 -> tagB,1 
key8 -> tagB,1 
key9 -> tagB,1
key10 -> tagB,1 
key11 -> tagB,2 
key12 -> tagB,2
以及分割器和合并器如下所示

    //Partitioner
public static class TaggedJoiningPartitioner implements Partitioner<Text, Text> {   
    @Override
    public int getPartition(Text key, Text value, int numPartitions) {
        String line = key.toString();
        String tokens[] = line.split(",");
        return (tokens[0].hashCode() & Integer.MAX_VALUE)% numPartitions;
    }
    @Override
    public void configure(JobConf arg0) {
        // TODO Auto-generated method stub //NOT OVERRIDING THIS METHOD
    }
}
//Comparator
public static class TaggedJoiningGroupingComparator extends WritableComparator {

    public TaggedJoiningGroupingComparator() {
        super(Text.class, true);
    }

    @Override
    public int compare(WritableComparable a, WritableComparable b) {
        String taggedKey1[] = ((Text)a).toString().split(",");
        String taggedKey2[] = ((Text)b).toString().split(",");
        return taggedKey1[0].compareTo(taggedKey2[0]);
    }
}

我花了很长时间试图解决这个问题,但还没有成功,任何帮助都值得感谢?

终于让它起作用了,实际上我改变了

conf.setOutputKeyComparatorClass(TaggedJoiningGroupingComparator.class); 

同样来自hadoop API文档--


setOutputValueGroupingComparator(ClassI在这里看不到二级排序。二级排序发生在哪里?我使用的是Hadoop的旧API。因此没有什么比job.setSortComparatorClass(CompositeKeyComparator.class)更好的了;可用。您能为旧API提供等价物吗?另外,我正在JobConf对象中设置分区器和比较器,如下所示:-conf.setPartitionerClass(TaggedJoiningPartitioner.class);conf.setOutputKeyComparatorClass(TaggedJoiningGroupingComparator.class);如何在减速机中进行迭代?如果可以,请显示一些代码。使用下面给定的更改修复了它,现在同一减速机上的键已正确排序。
conf.setOutputKeyComparatorClass(TaggedJoiningGroupingComparator.class); 
conf.setOutputValueGroupingComparator(TaggedJoiningGroupingComparator.class);
setOutputValueGroupingComparator(Class<? extends RawComparator> theClass)
Set the user defined RawComparator comparator for grouping keys in the input to the reduce.