Hadoop 如何定义自定义文本比较器

Hadoop 如何定义自定义文本比较器,hadoop,Hadoop,我的映射器将向reducer发出“hello”,而键实际上是double,例如,表示“hello”的平均计数是34.90。此外,输入格式为:hello 34.90 1:10;第2章20节;。。。, 看来我不能用反转器了 我尝试使用“DoubleWritable”作为键,但我不知道如何发出它,Collect似乎是唯一发出的 问题是“929.00”比“93.00”小,与事实相反,所以我想定义一个新的文本 public int compare(byte[] b1, int s1, int l1, by

我的映射器将向reducer发出“hello”,而键实际上是double,例如,表示“hello”的平均计数是34.90。此外,输入格式为:hello 34.90 1:10;第2章20节;。。。, 看来我不能用反转器了

我尝试使用“DoubleWritable”作为键,但我不知道如何发出它,Collect似乎是唯一发出的

问题是“929.00”比“93.00”小,与事实相反,所以我想定义一个新的文本

public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
{
  int n1 = WritableUtils.decodeVIntSize(b1[s1]);
  int n2 = WritableUtils.decodeVIntSize(b2[s2]);
  return compareBytes(b1, s1 + n1, l1 - n1, b2, s2 + n2, l2 - n2);
}
我不明白
s1+n1
l1-n1
的意思


感谢您的帮助^ ^。

您可以使用
floatwriteable
。以下是如何在mapper中发出该信息

public class CheckMapper extends Mapper<LongWritable,Text,FloatWritable,Text> 
{
//calculation on your hello count
public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException
    {
float var = hello_count;
String otheroutput = //do something with value
context.write(new FloatWritable(var),new Text(otheroutput));
}
}
公共类CheckMapper扩展了Mapper
{
//计算你的问候次数
公共void映射(LongWritable键、文本值、上下文上下文)引发IOException、InterruptedException
{
float var=hello\u计数;
String otheroutput=//使用值执行某些操作
write(新的FloatWritable(var)、新文本(otheroutput));
}
}

您不需要在这里定义自定义比较器类,FloatWritable的内置功能将解决这一问题。

谢谢,问题已经解决。我确实理解如何发出doubleWritable,我错过了这一点:Mapperi如果它解决了您的问题,请接受答案。