You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hbase.apache.org by Saiph Kappa <sa...@gmail.com> on 2013/12/12 19:27:27 UTC

HBase Client: How can I merge 2 results into 1?

Hi,

I am using version 0.94.14 and I am trying to merge KeyValues of 2 results
into 1 result.

Basically somewhere in time I cache a keyvalue of a result:

### Putting in cache KeyValue with key:
\x00\x09\x00\x00\x00\x04\x00\x00\x00\x00\x07\x011c\x00\x00\x01B\xE2\xE0\x0C\xEF\x04,
tableName: STOCK, Family: 1, Qualifier: c, Value: ^@^@^@3

Later I get that KeyValue from my cache and add it to a list
(List<KeyValues> kvs). Then I add some more KeyValues from a Result
instance to that list:

            kvs.addAll(partialResult.list());
            Collections.sort(kvs, KeyValue.COMPARATOR);

Finally, I build a new result with all those KeyValues ( new Result(kvs) ).

When I iterate through the map of that result I can read all values
correctly:

            for (byte[] f : result.getMap().keySet()) {
                System.out.print("### Result2 Family: " +
Bytes.toString(f));
                for (byte[] q : result.getFamilyMap(f).keySet()) {
                    System.out.print(" : Qualifier: " + Bytes.toString(q) +
" :: Value: "
                            +
Bytes.toString(result.getFamilyMap(f).get(q)));
                }
                System.out.println();
            }

But if I try to get values using result.getValue(...):

 for (byte[] f : result.getMap().keySet()) {
                System.out.print("### Result Family: " + Bytes.toString(f));
                for (byte[] q : result.getMap().get(f).keySet()) {
                    System.out.print(" : Qualifier: " + Bytes.toString(q) +
" :: Value: " + Bytes.toString(result.getValue(f, q)));
                }
  }

I only get the 2 first values, others are returned as null.

Here is the kvs list (where the first KeyValue was merged with the other 5
KeyValues):

### KVS Key:
\x00\x09\x00\x00\x00\x04\x00\x00\x00\x00\x07\x011c\x00\x00\x01B\xE2\xE0\x0C\xEF\x04,
Family: 1, Qualifier: c, Value: ^@^@^@3
### KVS Key:
\x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011j\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
Family: 1, Qualifier: j, Value: niutpzbmnewnfsowrlauxeda
### KVS Key:
\x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011n\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
Family: 1, Qualifier: n, Value: ^@^@^@^@
### KVS Key:
\x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011o\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
Family: 1, Qualifier: o, Value: ^@^@^@^@
### KVS Key:
\x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011p\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
Family: 1, Qualifier: p, Value: ^@^@^@^@
### KVS Key:
\x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011q\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
Family: 1, Qualifier: q, Value:
nbdpcwgwriaysaiqgkfozcacvalqymmuybsaoodidnbbltioqh
kvs length: 6


I tried to look further inside the code of Result.getValue and I noticed
that this line:
int pos = Arrays.binarySearch(kvs, searchTerm, KeyValue.COMPARATOR);
is returning -2 to the last 4 KeyValues in the kvs list, and that's why I
was getting those values as null.

(If I do not merge the first KeyValue the pos is returned correctly)

Why does this happen? What am I doing wrong?

Thanks.

Re: HBase Client: How can I merge 2 results into 1?

Posted by lars hofhansl <la...@apache.org>.
Hi Saiph,

no need to apologize.
Please keep asking questions as you encounter issues. :)

-- Lars



________________________________
 From: Saiph Kappa <sa...@gmail.com>
To: user@hbase.apache.org 
Sent: Thursday, December 12, 2013 12:59 PM
Subject: Re: HBase Client: How can I merge 2 results into 1?
 

I apologize, but I did a mistake. I was merging keyvalues from different
rows (there was a problem in the way I was comparing and decoding the
byte[] of rows) into a single result, which is not possible naturally.

Therefore, I ask you to delete this thread.

Thanks and sorry for any inconvenience.



On Thu, Dec 12, 2013 at 6:27 PM, Saiph Kappa <sa...@gmail.com> wrote:

> Hi,
>
> I am using version 0.94.14 and I am trying to merge KeyValues of 2 results
> into 1 result.
>
> Basically somewhere in time I cache a keyvalue of a result:
>
> ### Putting in cache KeyValue with key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x00\x00\x07\x011c\x00\x00\x01B\xE2\xE0\x0C\xEF\x04,
> tableName: STOCK, Family: 1, Qualifier: c, Value: ^@^@^@3
>
> Later I get that KeyValue from my cache and add it to a list
> (List<KeyValues> kvs). Then I add some more KeyValues from a Result
> instance to that list:
>
>             kvs.addAll(partialResult.list());
>             Collections.sort(kvs, KeyValue.COMPARATOR);
>
> Finally, I build a new result with all those KeyValues ( new Result(kvs) ).
>
> When I iterate through the map of that result I can read all values
> correctly:
>
>             for (byte[] f : result.getMap().keySet()) {
>                 System.out.print("### Result2 Family: " +
> Bytes.toString(f));
>                 for (byte[] q : result.getFamilyMap(f).keySet()) {
>                     System.out.print(" : Qualifier: " + Bytes.toString(q)
> + " :: Value: "
>                             +
> Bytes.toString(result.getFamilyMap(f).get(q)));
>                 }
>                 System.out.println();
>             }
>
> But if I try to get values using result.getValue(...):
>
>  for (byte[] f : result.getMap().keySet()) {
>                 System.out.print("### Result Family: " +
> Bytes.toString(f));
>                 for (byte[] q : result.getMap().get(f).keySet()) {
>                     System.out.print(" : Qualifier: " + Bytes.toString(q)
> + " :: Value: " + Bytes.toString(result.getValue(f, q)));
>                 }
>   }
>
> I only get the 2 first values, others are returned as null.
>
> Here is the kvs list (where the first KeyValue was merged with the other 5
> KeyValues):
>
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x00\x00\x07\x011c\x00\x00\x01B\xE2\xE0\x0C\xEF\x04,
> Family: 1, Qualifier: c, Value: ^@^@^@3
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011j\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: j, Value: niutpzbmnewnfsowrlauxeda
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011n\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: n, Value: ^@^@^@^@
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011o\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: o, Value: ^@^@^@^@
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011p\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: p, Value: ^@^@^@^@
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011q\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: q, Value:
> nbdpcwgwriaysaiqgkfozcacvalqymmuybsaoodidnbbltioqh
> kvs length: 6
>
>
> I tried to look further inside the code of Result.getValue and I noticed
> that this line:
> int pos = Arrays.binarySearch(kvs, searchTerm, KeyValue.COMPARATOR);
> is returning -2 to the last 4 KeyValues in the kvs list, and that's why I
> was getting those values as null.
>
> (If I do not merge the first KeyValue the pos is returned correctly)
>
> Why does this happen? What am I doing wrong?
>
> Thanks.
>

Re: HBase Client: How can I merge 2 results into 1?

Posted by Saiph Kappa <sa...@gmail.com>.
I apologize, but I did a mistake. I was merging keyvalues from different
rows (there was a problem in the way I was comparing and decoding the
byte[] of rows) into a single result, which is not possible naturally.

Therefore, I ask you to delete this thread.

Thanks and sorry for any inconvenience.


On Thu, Dec 12, 2013 at 6:27 PM, Saiph Kappa <sa...@gmail.com> wrote:

> Hi,
>
> I am using version 0.94.14 and I am trying to merge KeyValues of 2 results
> into 1 result.
>
> Basically somewhere in time I cache a keyvalue of a result:
>
> ### Putting in cache KeyValue with key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x00\x00\x07\x011c\x00\x00\x01B\xE2\xE0\x0C\xEF\x04,
> tableName: STOCK, Family: 1, Qualifier: c, Value: ^@^@^@3
>
> Later I get that KeyValue from my cache and add it to a list
> (List<KeyValues> kvs). Then I add some more KeyValues from a Result
> instance to that list:
>
>             kvs.addAll(partialResult.list());
>             Collections.sort(kvs, KeyValue.COMPARATOR);
>
> Finally, I build a new result with all those KeyValues ( new Result(kvs) ).
>
> When I iterate through the map of that result I can read all values
> correctly:
>
>             for (byte[] f : result.getMap().keySet()) {
>                 System.out.print("### Result2 Family: " +
> Bytes.toString(f));
>                 for (byte[] q : result.getFamilyMap(f).keySet()) {
>                     System.out.print(" : Qualifier: " + Bytes.toString(q)
> + " :: Value: "
>                             +
> Bytes.toString(result.getFamilyMap(f).get(q)));
>                 }
>                 System.out.println();
>             }
>
> But if I try to get values using result.getValue(...):
>
>  for (byte[] f : result.getMap().keySet()) {
>                 System.out.print("### Result Family: " +
> Bytes.toString(f));
>                 for (byte[] q : result.getMap().get(f).keySet()) {
>                     System.out.print(" : Qualifier: " + Bytes.toString(q)
> + " :: Value: " + Bytes.toString(result.getValue(f, q)));
>                 }
>   }
>
> I only get the 2 first values, others are returned as null.
>
> Here is the kvs list (where the first KeyValue was merged with the other 5
> KeyValues):
>
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x00\x00\x07\x011c\x00\x00\x01B\xE2\xE0\x0C\xEF\x04,
> Family: 1, Qualifier: c, Value: ^@^@^@3
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011j\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: j, Value: niutpzbmnewnfsowrlauxeda
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011n\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: n, Value: ^@^@^@^@
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011o\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: o, Value: ^@^@^@^@
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011p\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: p, Value: ^@^@^@^@
> ### KVS Key:
> \x00\x09\x00\x00\x00\x04\x00\x00\x01a\x97\x011q\x00\x00\x01B\xE2\xE0\xF0\x9D\x04,
> Family: 1, Qualifier: q, Value:
> nbdpcwgwriaysaiqgkfozcacvalqymmuybsaoodidnbbltioqh
> kvs length: 6
>
>
> I tried to look further inside the code of Result.getValue and I noticed
> that this line:
> int pos = Arrays.binarySearch(kvs, searchTerm, KeyValue.COMPARATOR);
> is returning -2 to the last 4 KeyValues in the kvs list, and that's why I
> was getting those values as null.
>
> (If I do not merge the first KeyValue the pos is returned correctly)
>
> Why does this happen? What am I doing wrong?
>
> Thanks.
>