Hadoop自定义密钥或自定义可写密钥

Hadoop自定义密钥或自定义可写密钥,hadoop,mapreduce,Hadoop,Mapreduce,示例1: Q1但是如果我们想让它成为一个定制的可写的可比文件呢? Ans:我们需要实现compareTo()方法,也是一个行比较器,以使其快速工作 示例2: Q2,如果我的自定义对象中有两个以上的文本字段,一个长可写字段,该怎么办? 如例1所示,Comparator.Compare方法的代码片段。 这将适用于只包含两个属性(文本)的数据类型 如果自定义数据类型包含两个以上的元素,那么一个文本、两个IntWaritable、一个BooleanAritable将如何 在这种情况下如何实现rawCom

示例1: Q1但是如果我们想让它成为一个定制的可写的可比文件呢? Ans:我们需要实现compareTo()方法,也是一个行比较器,以使其快速工作

示例2:

Q2,如果我的自定义对象中有两个以上的文本字段,一个长可写字段,该怎么办? 如例1所示,Comparator.Compare方法的代码片段。 这将适用于只包含两个属性(文本)的数据类型

如果自定义数据类型包含两个以上的元素,那么一个文本、两个IntWaritable、一个BooleanAritable将如何

在这种情况下如何实现rawComparator

public int compare(byte[] b1, int s1, int l1, 
           byte[] b2, int s2, int l2)   {
  try {
     int firstL1 = WritableUtils.decodeVIntSize(b1[s1]) + readVInt(b1, s1);
     int firstL2 = WritableUtils.decodeVIntSize(b2[s2]) + readVInt(b2, s2);
     int cmp = TEXT_COMPARATOR.compare(b1, s1, firstL1, b2, s2, firstL2);
     if (cmp != 0) {
         return cmp;
      }
  return TEXT_COMPARATOR.compare(b1, s1 + firstL1,
            l1 - firstL1,b2, s2 + firstL2, l2 - firstL2);
  }catch (IOException e) {
    throw new IllegalArgumentException(e);
}

那么,问题是什么?你哪里有问题?你能再详细一点吗?非常感谢。我需要的是一个带有taw比较器的自定义可写对象的实现,就像示例1中的TextPair一样,它包含两个以上的文本对象&一个LongWritable对象,重要的是CustomWritable的RawComparator的一个实现,它至少有3个文本对象和一个LongWritable对象。问题是,如果有两个以上的自定义对象,其中有三个文本对象作为字段,那么假设每个自定义对象的文本由“\t”分隔,类似于“text1”+“\t”+“text2+”\t”+“text2”,您可以使用RAWComarator比较两个自定义对象,如
int compare(byte[]bytescoustomobject1,int s1,int l1,byte[]bytescoustomobject2,int s2,int l2)
。这就是您试图处理的情况吗?比较文本和长文本都取决于用例需求。假设我有一个person类,有两个文本字段name&gender和一个int字段age。如果我有一个比较person1和person2的要求,那就由我来决定如何比较两者。我会说1岁和2岁比较,如果两者相等,我会在名字上用字母表比较,如果两者仍然相等,我会在两者上用性别比较,在最坏的情况下,如果两者都相等,简单地说是person1=person2。我怀疑我是否完全理解这个问题。@user2458922:我不认为TextPair是在比较属于同一TextPair对象的第一对第二个,而是比较两个TextPair。