设为首页 收藏本站
查看: 646|回复: 0

[经验分享] Hadoop学习三十七:HBase比较负数

[复制链接]

尚未签到

发表于 2016-12-10 09:26:26 | 显示全部楼层 |阅读模式
一.HBase存储
  HBase存储的都是字节码。我们也知道,计算机系统里,数值一律采用补码来表示和存储(http://zy19982004.iyunv.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));         
}

}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312186-1-1.html 上篇帖子: Hadoop的MapReduce的工作机制剖析 下篇帖子: hadoop mapreduce到底是如何运行的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表