You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Nick Dimiduk (JIRA)" <ji...@apache.org> on 2014/03/26 18:59:15 UTC

[jira] [Commented] (HBASE-10836) Filters failing to compare negative numbers (int,float,double or long)

    [ https://issues.apache.org/jira/browse/HBASE-10836?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13948222#comment-13948222 ] 

Nick Dimiduk commented on HBASE-10836:
--------------------------------------

This is a question for the [user@|http://mail-archives.apache.org/mod_mbox/hbase-user/] mailing list, not a jira ticket.

HBase is a byte[] comparison machine at it's core. It is unaware of user-level data types. If you want to order/compare/filter integers natively in hbase, you need to use an encoding scheme that preserves order. {{Bytes#toBytes(int)}} does not. Have a look at the {{OrderedBytes}} utility class included in 0.96 for alternative numeric encodings. You may also be interested in HBASE-10789.

> Filters failing to compare negative numbers (int,float,double or long)
> ----------------------------------------------------------------------
>
>                 Key: HBASE-10836
>                 URL: https://issues.apache.org/jira/browse/HBASE-10836
>             Project: HBase
>          Issue Type: Brainstorming
>          Components: Filters
>    Affects Versions: 0.94.2
>         Environment: Psuedo-mode
>            Reporter: Chaitanya Kumar
>              Labels: features
>
> I have come across an issue while using filters to get a result.
> For eg.
> I have created a table and its specifications are as follows :
> table name --> test
> column family --> cf
> row keys --> rowKey1 - rowKey10 (10 different row keys)
> column qualifier --> integerData
> For different rowkeys, the qualifier 'integerData' contains either positive or negative integer values (data loaded randomly).
> Now, while I am trying to retrieve the data from the table based on a filter condition, its failing to give the desired result.
> For eg. say,
> My table contains following data :
> [-50,-40,-30,-20,-10,10,20,30,40,50]
> I want to get only those values which are greater than or equal to 40.
> Following is the code for the filter set on scan :
> ********************************************
>   Scan scan = new Scan();
>   scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes(" integerData"));
>                
>   int i = 40;
>   Filter filter = new ValueFilter(CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes(i)));
>   scan.setFilter(filter);
> *********************************************
> The result should be : 40 and 50
> BUT, the actual result is : -50, -40, -30, -20, -10, 40, 50
> I have read few posts which addressed this issue, and few people provided the solution as:
> 1) write a custom comparator, as BinaryComparator is not meant for number comparison
> OR
> 2) retrieve all the values as integer and then compare
> BUT, I want to know if there is any other way to achieve this.
> Because this seems to be a very basic need, i.e. comparing numbers, and I feel HBase should have something straight forward to deal with this.
> This comparison fails only when the negative numbers are involved.
> I am not able to get the right way to do it.
> My Hbase version is 0.94.2 and I am running it in pseudo mode.
> Can anyone help me on this ? 



--
This message was sent by Atlassian JIRA
(v6.2#6252)