when you do Bytes.toBytes(1000), you are not telling it whether 1000 is integer or long.. you have to be super careful here.. i didnt read the flow fully but this caught my eye immediate.. try repopulating properly and use proper types when using Bytes.
thanks On Fri, Feb 24, 2012 at 4:25 PM, Bing Li <[email protected]> wrote: > Dear all, > > I created a table as follows. I need to retrieve by the column of "Salary", > which is a long type data. Some errors are got as follows. > > ROW COLUMN+CELL > > Classmate1 column=ClassmateFamily:Address, > timestamp=1330118559432, value=Canada > Classmate1 column=ClassmateFamily:Age, > timestamp=1330118559429, value=42 > Classmate1 column=ClassmateFamily:Career, > timestamp=1330118559431, value=Faculty > Classmate1 column=ClassmateFamily:Hobby, > timestamp=1330118559433, value=Soccer > Classmate1 column=ClassmateFamily:Name, > timestamp=1330118559427, value=Bing > Classmate1 column=ClassmateFamily:Salary, > timestamp=1330121577483, value=\x00\x00\x00\x00\x00\x00\x03\xEA (1002 - > long) > Classmate2 column=ClassmateFamily:Address, > timestamp=1330118559436, value=US > Classmate2 column=ClassmateFamily:Age, > timestamp=1330118559434, value=52 > Classmate2 column=ClassmateFamily:Career, > timestamp=1330118559435, value=Educator > Classmate2 column=ClassmateFamily:Hobby, > timestamp=1330118559437, value=Music > Classmate2 column=ClassmateFamily:Name, > timestamp=1330118559433, value=GreatFree > Classmate2 column=ClassmateFamily:Salary, > timestamp=1330118559393, value=\x00\x00\x00\x00\x00\x00\x05\xDC (1500 - > long) > Classmate3 column=ClassmateFamily:Address, > timestamp=1330118559440, value=US > Classmate3 column=ClassmateFamily:Age, > timestamp=1330118559438, value=100 > Classmate3 column=ClassmateFamily:Career, > timestamp=1330118559439, value=Researcher > Classmate3 column=ClassmateFamily:Hobby, > timestamp=1330118559442, value=Science > Classmate3 column=ClassmateFamily:Name, > timestamp=1330118559437, value=LBLabs > Classmate3 column=ClassmateFamily:Salary, > timestamp=1330118559397, value=\x00\x00\x00\x00\x00\x00\x07\x08 (1800 - > long) > Classmate4 column=ClassmateFamily:Address, > timestamp=1330118559445, value=Baoji > Classmate4 column=ClassmateFamily:Age, > timestamp=1330118559443, value=41 > Classmate4 column=ClassmateFamily:Career, > timestamp=1330118559444, value=Lawyer > Classmate4 column=ClassmateFamily:Hobby, > timestamp=1330118559446, value=Drawing > Classmate4 column=ClassmateFamily:Name, > timestamp=1330118559442, value=Dezhi > Classmate4 column=ClassmateFamily:Salary, > timestamp=1330118559399, value=\x00\x00\x00\x00\x00\x00\x03 (800 - long) > > The code is listed below. > > Filter filter = new > ValueFilter(CompareFilter.CompareOp.LESS, new > BinaryComparator(Bytes.toBytes(1000))); // The filter line * > > Scan scan = new Scan(); > scan.addColumn(Bytes.toBytes("ClassmateFamily"), > Bytes.toBytes("Salary")); > scan.setFilter(filter); > > ResultScanner scanner = table.getScanner(scan); > for (Result result : scanner) > { > for (KeyValue kv : result.raw()) > { > System.out.println("KV: " + kv + ", Value: > " + Bytes.toLong(kv.getValue())); > } > } > scanner.close(); > > System.out.println("------------------------------------"); > > Get get = new Get(Bytes.toBytes("Classmate3")); > get.setFilter(filter); > Result result = table.get(get); > for (KeyValue kv : result.raw()) > { > System.out.println("KV: " + kv + ", Value: " + > Bytes.toLong(kv.getValue())); > } > > I think the correct result should be like the one below. Only the rows that > are less than 1000 must be returned, right? > > [java] KV: Classmate4/ClassmateFamily:Salary/1330118559399/Put/vlen=8, > Value: 800 > [java] ------------------------------------ > > > But, the actual result is as follows. Some rows which are higher than 1000 > are returned. Why? > > [java] KV: Classmate1/ClassmateFamily:Salary/1330121577483/Put/vlen=8, > Value: 1002 > [java] KV: Classmate2/ClassmateFamily:Salary/1330118559393/Put/vlen=8, > Value: 1500 > [java] KV: Classmate3/ClassmateFamily:Salary/1330118559397/Put/vlen=8, > Value: 1800 > [java] KV: Classmate4/ClassmateFamily:Salary/1330118559399/Put/vlen=8, > Value: 800 > [java] ------------------------------------ > [java] KV: Classmate3/ClassmateFamily:Salary/1330118559397/Put/vlen=8, > Value: 1800 > > If I change the filter line to the following one, > > Filter filter = new ValueFilter(CompareFilter.CompareOp.GREATER, > new BinaryComparator(Bytes.toBytes(1000))); // The filter line * > > I guess the correct result should be as follows. The ones that are higher > than 1000 must be returned. > > [java] KV: Classmate1/ClassmateFamily:Salary/1330121577483/Put/vlen=8, > Value: 1002 > [java] KV: Classmate2/ClassmateFamily:Salary/1330118559393/Put/vlen=8, > Value: 1500 > [java] KV: Classmate3/ClassmateFamily:Salary/1330118559397/Put/vlen=8, > Value: 1800 > [java] ------------------------------------ > [java] KV: Classmate3/ClassmateFamily:Salary/1330118559397/Put/vlen=8, > Value: 1800 > > But in practice, I got a different result and an exception as follows. I > cannot figure out the problem. > > [java] ------------------------------------ > [java] Exception in thread "main" java.lang.IllegalArgumentException: > offset (0) + length (8) exceed the capacity of the array: 2 > [java] at > > org.apache.hadoop.hbase.util.Bytes.explainWrongLengthOrOffset(Bytes.java:527) > [java] at org.apache.hadoop.hbase.util.Bytes.toLong(Bytes.java:505) > [java] at org.apache.hadoop.hbase.util.Bytes.toLong(Bytes.java:478) > [java] at > com.greatfree.testing.hbase.OrderedQualifierValue.main(Unknown Source) > > Could you please give me a hand? Thanks so much! > > Best regards, > Bing >
