如何定义自定义Text.Comparator

时间:2015-11-03 05:20:54

标签: hadoop

我的映射器将发出< 文本文本>对于reducer,键实际上是double,例如< '34 .90','hello'>,表示'hello'的平均计数是34.90。此外,输入格式为:hello 34.90 fiction1:10; fiction2:20; ..., 似乎我不能使用InverseMapper。

我尝试使用'DoubleWritable'作为键,但我不知道如何发出它,Collect似乎发出< Text Text >仅

问题是'929.00'小于'93 .00',反对事实,所以我想定义一个新的Text.Comparator,我看源代码

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+n1l1-n1的含义。

感谢您的帮助^ _ ^。

1 个答案:

答案 0 :(得分:0)

您可以使用FloatWritable。以下是在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));
}
}

您不需要在此定义自定义比较器类,FloatWritable的内置功能可以解决这个问题。