That is correct. If you do this on the client (for example with a KeyValue you got from a Result object) it might work, but generally you cannot do this.
This, however will always work: KeyValue kv = ...; KeyValue myKv = new KeyValue(kv.getBuffer(), kv.getOffset()); byte[] myRowKey = myKv.getRow(); Think of a KeyValue object as a "pointer" into a larger byte[]. Java (unfortunately!) does not have pointers, so we have to pass the array and an offset around. -- Lars ----- Original Message ----- From: Kim Chew <[email protected]> To: [email protected] Cc: Sent: Wednesday, September 25, 2013 10:12 AM Subject: Re: KeyValue.getLength() question hmm, does it mean if I do something like this, I won't get the correct KeyValue object back? byte[] rowKey = kv.getRow(); byte[] buf = kv.getBuffer(); KeyValue myKv = new KeyValue(buf); byte[] myRowKey = myKv.getRow(); rowKey will not be equal to myRowKey. Kim On Wed, Sep 25, 2013 at 12:13 AM, Robert Dyer <[email protected]> wrote: > Note that the buffer may be larger than the actually used portion. > > myKV.getBuffer().length gives you the length of the buffer (allocated > array) > myKV.getLength() gives you the length of the USED buffer (less than or > equal to the previous) > > > On Wed, Sep 25, 2013 at 2:06 AM, Kim Chew <[email protected]> wrote: > > > Hello, > > > > I have a "strange" situation that I can't wrap my head around it. Say, > for > > example, I have an KeyValue instance, shouldn't > > > > myKV.getLength() == myKV.getBuffer().length ? > > > > Given that, "getLength()" returns "Length of bytes this KeyValue occupies > > in getBuffer()< > > > http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/KeyValue.html#getBuffer%28%29 > > > > > ." > > > > > > In my case the value returned by "myKV.getBuffer().length" is greater > than > > "myKV.getLength()". What possibly went wrong? > > > > TIA > > > > Kim. > > > > > > -- > > Robert Dyer > [email protected] >
