HBase 0.98版本,如何实现自定义比较器(ByteArrayComparable)

82 views
Skip to first unread message

小咸菜

unread,
Apr 1, 2014, 2:12:35 AM4/1/14
to hado...@googlegroups.com
如何在HBase 0.98版本中实现一个自定义的比较器,继承ByteArrayComparable抽象类。该抽象类有两个抽象方法compareTo 和 toByteArray。compareTo实现比较逻辑,但是toByteArray不知道该怎么写。

HBase自带的比较器:BinaryComparator、BinaryPrefixComparator、RegexStringComparator、SubstringComparator等的toByteArray方法如下

// BinaryComparator
public byte [] toByteArray() {
    ComparatorProtos.BinaryComparator.Builder builder =
      ComparatorProtos.BinaryComparator.newBuilder();
    builder.setComparable(super.convert());
    return builder.build().toByteArray();
  }

// BinaryPrefixComparator
public byte [] toByteArray() {
    ComparatorProtos.BinaryPrefixComparator.Builder builder =
      ComparatorProtos.BinaryPrefixComparator.newBuilder();
    builder.setComparable(super.convert());
    return builder.build().toByteArray();
  }

// RegexStringComparator
public byte [] toByteArray() {
    ComparatorProtos.RegexStringComparator.Builder builder =
      ComparatorProtos.RegexStringComparator.newBuilder();
    builder.setPattern(pattern.toString());
    builder.setPatternFlags(pattern.flags());
    builder.setCharset(charset.name());
    return builder.build().toByteArray();
  }

// SubstringComparator
public byte [] toByteArray() {
    ComparatorProtos.SubstringComparator.Builder builder =
      ComparatorProtos.SubstringComparator.newBuilder();
    builder.setSubstr(this.substr);
    return builder.build().toByteArray();
  }
都是使用的ComparatorProtos中的一些内部类。如果自己实现比较器,比如日期比较器、数值比较器,这个方法该怎么写

zj

unread,
May 26, 2014, 4:12:02 AM5/26/14
to hado...@googlegroups.com
hi,你好!
看你的这个帖子,我有一样的疑问,但是没有找到解决方法,请问你现在知道怎么解决这个问题了吗?
谢谢哈1


xianneng lin

unread,
Jun 9, 2014, 6:53:41 AM6/9/14
to hado...@googlegroups.com
嗯,需要自己定义proto的
=============================================
package ****
option java_outer_classname = "ComparatorProtos";

message DateComparator {
required int64 value = 1; // value
required string dateFormatStr = 2; // 日期格式
}

message NumberComparator {
required double value = 1; // value
}
=============================================

编译之后,在代码里使用编译生成的java类,example如下

 @Override
    public byte[] toByteArray() {
        ComparatorProtos.NumberComparator.Builder builder = ComparatorProtos.NumberComparator
            .newBuilder();
        builder.setValue(value);
        return builder.build().toByteArray();
    }

    public static ByteArrayComparable parseFrom(final byte[] pbBytes)
        throws DeserializationException {
        ComparatorProtos.NumberComparator proto;
        try {
            proto = ComparatorProtos.NumberComparator.parseFrom(pbBytes);
        } catch (InvalidProtocolBufferException e) {
            throw new DeserializationException(e);
        }
        NumberComparator comparator = new NumberComparator(proto.getValue());
        return comparator;
    }


--
您收到此邮件是因为您订阅了Google网上论坛中的“Hadoop中国用户组(CHUG)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到hadoopors+...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout



--
         致
礼!
Reply all
Reply to author
Forward
0 new messages