一.HBase存储
HBase存储的都是字节码。我们也知道,计算机系统里,数值一律采用补码来表示和存储(http://zy19982004.iteye.com/blog/1706138)。
那么Integer(-1)在HBase里将被存储为\xFF\xFF\xFF\xFF,Integer(1)在Hbase里将被存储为\x00\x00\x00\x01。
再来看看在比较大小时的PureJavaComparer.compareTo,会将字节码,通过&0xff,转换成一个无符号位的正数。此时将出现\xFF\xFF\xFF\xFF & 0xff = \xFF = 255,x00\x00\x00\x01 & 0xff = \x01 = 1,所以-1>1。
最终,HBase认为数值类从小到大为:0 1 +∞ -∞ -1
二.怎么解决
至少有三种思路
- 细分四种查询条件,过滤掉多查的,加上少查的。如查询>某一正数时,要加上<+∞这个条件来过滤掉[-∞ -1]。显然这种方法管用但过于繁琐,新增了许多过滤器对regionserver也是一种压力。
- 存储时将负数转成正数,将正数转成更大的正数,查询时根据相同规则转换查询条件,查询出来的结果再反转回去。这样存储的结果就只能对查询有用了,其它系统使用你这些HBase数据时,它并不一定知道你的存储规则。
- 自己写一个数字类比较器NumberComparator,子类DoubleComparator,IntegerComparator等里重写compareTo方法。这个也是我采用的方式。
三.关于比较器 等于
在容器里面,会涉及到equals,compareTo等方法来比较两个数的等于关系和大小关系。
容器A里已经插入1 2 3三个数据,要插入4的时候,会把4当做this,与1 2 3分别equals或者compareTo,即4.compareTo(1)。所以我们重写equals,compareTo等方法时,也是this 4在前,参数1在后。如果你想得到相反的顺序,就把参数放前,this放后。
package org.apache.hadoop.hbase.filter; import org.apache.hadoop.hbase.util.Bytes; public class DoubleComparator extends NumberComparator { public DoubleComparator() { } public DoubleComparator(final byte[] value) { super(value); } @Override public int compareTo(byte[] value, int offset, int length) { double d1 = Bytes.toDouble(super.value); double d2 = Bytes.toDouble(value, offset); if (d1 < d2) return -1; // Neither val is NaN, thisVal is smaller if (d1 > d2) return 1; // Neither val is NaN, thisVal is larger long thisBits = Double.doubleToLongBits(d1); long anotherBits = Double.doubleToLongBits(d2); return (thisBits == anotherBits ? 0 : // Values are equal (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN) 1)); } }
相关推荐
NULL 博文链接:https://zy19982004.iteye.com/blog/2088173
赠送jar包:hbase-hadoop2-compat-1.2.12.jar; 赠送原API文档:hbase-hadoop2-compat-1.2.12-javadoc.jar; 赠送源代码:hbase-hadoop2-compat-1.2.12-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop2-compat-...
分布式存储系统hadoop:hbase安装经验,非常不错的hadoop之hbase,入门环境搭建。
赠送jar包:hbase-hadoop-compat-1.1.3.jar; 赠送原API文档:hbase-hadoop-compat-1.1.3-javadoc.jar; 赠送源代码:hbase-hadoop-compat-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop-compat-1.1.3....
HBase开发实战,HBase学习利器:HBase实战
赠送jar包:hbase-hadoop2-compat-1.1.3.jar; 赠送原API文档:hbase-hadoop2-compat-1.1.3-javadoc.jar; 赠送源代码:hbase-hadoop2-compat-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop2-compat-...
赠送jar包:hbase-hadoop-compat-1.1.3.jar; 赠送原API文档:hbase-hadoop-compat-1.1.3-javadoc.jar; 赠送源代码:hbase-hadoop-compat-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop-compat-1.1.3....
1、内容概要:Hadoop+Spark+Hive+HBase+Oozie+Kafka+Flume+Flink+Elasticsearch+Redash等大数据集群及组件搭建指南(详细搭建步骤+实践过程问题总结)。 2、适合人群:大数据运维、大数据相关技术及组件初学者。 3、...
Hadoop学习总结之五:Hadoop的运行痕迹
hadoop面试题,HBase与BigTable的比较这是一个很经典的面试题,面试Hadoop必问的问题,值得关注学习。
赠送jar包:hbase-hadoop2-compat-1.1.3.jar; 赠送原API文档:hbase-hadoop2-compat-1.1.3-javadoc.jar; 赠送源代码:hbase-hadoop2-compat-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop2-compat-...
Hadoop学习总结之四:Map-Reduce的过程解析
赠送jar包:hbase-hadoop-compat-1.4.3.jar; 赠送原API文档:hbase-hadoop-compat-1.4.3-javadoc.jar; 赠送源代码:hbase-hadoop-compat-1.4.3-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop-compat-1.4.3....
Hadoop学习总结之一:HDFS简介
Hadoop2.2+Zookeeper3.4.5+HBase0.96集群环境搭建
赠送jar包:hbase-hadoop-compat-1.2.12.jar; 赠送原API文档:hbase-hadoop-compat-1.2.12-javadoc.jar; 赠送源代码:hbase-hadoop-compat-1.2.12-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop-compat-...
第八章(Hadoop大数据处理实战)HBase实战.pdf第八章(Hadoop大数据处理实战)HBase实战.pdf第八章(Hadoop大数据处理实战)HBase实战.pdf第八章(Hadoop大数据处理实战)HBase实战.pdf第八章(Hadoop大数据处理实战)HBase...
hbase-0.90.5.tar.gz与hadoop0.20.2版本匹配,我在我本地虚拟机已经安装成功可以使用。请放心下载!!!
Hadoop学习总结之二:HDFS读写过程解析
赠送jar包:hbase-hadoop-compat-1.2.12.jar; 赠送原API文档:hbase-hadoop-compat-1.2.12-javadoc.jar; 赠送源代码:hbase-hadoop-compat-1.2.12-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop-compat-...