Java 未调用Hadoop GroupingComparatorClass.compare方法
我创建了一个hadoop作业,其中I job.setGroupingComparatorClass带有我创建的comparator类PathDateComparator。运行作业时,我可以看到PathDateComparator的构造函数正在被调用,但compare函数没有被调用 下面是PathDateComparator类:Java 未调用Hadoop GroupingComparatorClass.compare方法,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我创建了一个hadoop作业,其中I job.setGroupingComparatorClass带有我创建的comparator类PathDateComparator。运行作业时,我可以看到PathDateComparator的构造函数正在被调用,但compare函数没有被调用 下面是PathDateComparator类: 这里引用的类PathDateComparator需要是RawComparator的实现者。不过,compare方法看起来是正确的。其思想是,该类仅用于比较编码为字节数组的
这里引用的类PathDateComparator需要是RawComparator的实现者。不过,compare方法看起来是正确的。其思想是,该类仅用于比较编码为字节数组的键值。您在哪里查找sysout语句,如果配置了组合器,它们最有可能位于映射任务日志中的reducer任务日志中。@ChrisWhite我现在正在本地测试,所以所有输出/日志都将转到cli。例如,我有一个SortComparatorClass集合,我可以在调用它的compare方法时看到输出。你能分享更多你的代码作业驱动程序吗。
public class PathDateComparator extends WritableComparator {
protected PathDateComparator() {
super(Text.class, true);
System.out.println("PathDateComparator");
}
private String getPath(String s) {
System.out.println("s:" + s);
String[] temp = s.split(IOUtil.tab);
return temp[0];
}
@Override
public int compare(Object o1, Object o2) {
String k1 = ((Text) o1).toString();
System.out.println("k1:" + k1);
String path1 = getPath(k1);
System.out.println("path1:" + path1);
String k2 = ((Text) o2).toString();
System.out.println("k2:" + k2);
String path2 = getPath(k2);
System.out.println("path2:" + path2);
return path1.compareTo(path2);
}
@Override
public int compare(WritableComparable o1, WritableComparable o2) {
String k1 = ((Text) o1).toString();
System.out.println("k1:" + k1);
String path1 = getPath(k1);
System.out.println("path1:" + path1);
String k2 = ((Text) o2).toString();
System.out.println("k2:" + k2);
String path2 = getPath(k2);
System.out.println("path2:" + path2);
return path1.compareTo(path2);
}
@Override
public int compare(byte[] bArray1, int offset1, int length1,
byte[] bArray2, int offset2, int length2) {
String k1 = new String(Arrays.copyOfRange(bArray1, offset1, offset1 + length1));
System.out.println("k1:" + k1);
String path1 = getPath(k1);
System.out.println("path1:" + path1);
String k2 = new String(Arrays.copyOfRange(bArray2, offset2, offset2 + length2));
System.out.println("k2:" + k2);
String path2 = getPath(k2);
System.out.println("path2:" + path2);
return path1.compareTo(path2);
}
}