一、存入数据类型

Hbase里面,rowkey是按照字典序进行排序。存储的value值,当用filter进行数据筛选的时候,所用的比较算法也是字典序的。

1、当存储的value值是float类型的时候,录入数据可以录入,但是读取出来的数据会存在问题会出问题

例如:

存入数据的代码:

p = new Put(Bytes.toBytes(“66”));

p.add(Bytes.toBytes("value"),Bytes.toBytes("null"), (Long.valueOf(“668”) ), Bytes.toBytes(Float.valueOf(533.0)));

...

在hbase shell里面取出的数据:

hbase(main):007:0> get 'DATA‘, '66'
COLUMN                CELL
value:null           timestamp=668, value=D\x05@\x00
1 row(s) in 0.1100 seconds
可以看到取出来的value值是不可读的。

在java程序里面则没有返回结果,如果想强制类型转换读取这个数据,则会报错,说格式错误:

try {
   Result rr = table.get(g);
   for (KeyValue kvv : rr.raw()) {
float f = Float.parseFloat(new String(kvv.getValue()));
    System.out.println(f);
    tempList.add(kvv.getTimestamp() + "," + new String(kvv.getValue()));
   }
  } catch (IOException e) {
   e.printStackTrace();
  }

java.lang.NumberFormatException: For input string: "D@"

根据hbase都是按照字典序进行排序的前提,(字典序多少针对字符串的),可以推测hbase不支持float类型数据的存储

2、如果把录入数据改成int型

存入数据的代码:

p = new Put(Bytes.toBytes(“66”));

p.add(Bytes.toBytes("value"),Bytes.toBytes("null"), (Long.valueOf(“668”) ), Bytes.toBytes(Integer.valueOf(533.0)));

...

取出的数据

hbase(main):007:0> get 'DATA‘, '66'

COLUMN CELL
value:null timestamp=668, value=\x00\x00\x00\x00\x00\x00\x02\x15
1 row(s) in 1.4510 seconds

在java程序里面则没有返回结果,当试图把取出的数据强制类型转换的时候,同样报错

3、 如果把录入数据改成long型

存入数据的代码:

p = new Put(Bytes.toBytes(“66”));

p.add(Bytes.toBytes("value"),Bytes.toBytes("null"), (Long.valueOf(“668”) ), Bytes.toBytes(Long.valueOf(533.0)));

...

取出的数据

hbase(main):007:0> get 'DATA‘, '66'

COLUMN                CELL
value:null           timestamp=668, value=\x00\x00\x00\x00\x00\x00\x02\x15
1 row(s) in 1.4510 seconds

同样不可读

4、如果把录入value格式改成String类型,则正常

存入数据的代码:

p = new Put(Bytes.toBytes(“66”));

p.add(Bytes.toBytes("value"),Bytes.toBytes("null"), (Long.valueOf(“668”) ), Bytes.toBytes("533.0"));

...

取出的数据

hbase(main):007:0> get 'DATA‘, '66'

COLUMN                CELL
value:null           timestamp=668, value=533.0
1 row(s) in 0.8500 seconds

在java程序里面也有可用的结果

通过上述测试说明,hbase现在只支持String类型数据的存取

二、 小的注意点

1、取value的时候一定要用 new String(kv[i].getValue())的格式

System.out.println(kv[i].getValue().toString());     错误
    System.out.println(new String(kv[i].getValue()));    正确

2、用完ResultScanner 后一定要记得关掉:resultScanner.close();

3、当录入的数据已经使用了String类型

那么,进行比较的时候也要使用String类型。例如下面使用float类型的filter,则不会对结果产生任何影响

Filter filter = new SingleColumnValueFilter(
             Bytes.toBytes("value"),Bytes.toBytes("null") , CompareOp.LESS,Bytes.toBytes(Float.valueOf((float) 5.0)));
  scan.setFilter(filter); 
如果换成

Filter filter = new SingleColumnValueFilter(
             Bytes.toBytes("value"),Bytes.toBytes("null") , CompareOp.LESS,Bytes.toBytes("5.0"));

scan.setFilter(filter);

则会会结果产生影响,但是需要注意的是,这里的设置方式也是错误的

追踪原因:

hbase关于比较的相关源码如下:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

public static int compareTo(final byte [] left, final byte [] right) {
    return compareTo(left, 0, left.length, right, 0, right.length);
  }

public static int compareTo(byte[] buffer1, int offset1, int length1,
      byte[] buffer2, int offset2, int length2) {
    // Bring WritableComparator code local
    int end1 = offset1 + length1;
    int end2 = offset2 + length2;
    for (int i = offset1, j = offset2; i < end1 && j < end2; i++, j++) {
      int a = (buffer1[i] & 0xff);
      int b = (buffer2[j] & 0xff);

      if (a != b) {
        return a - b;
      }
    }
    return length1 - length2;
  }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

疑问:下面long型筛选,返回的结果并没有value值,但是,结果的数据条数却会发生变化,即使针对这个特定的时间戳读取数据也没有结果数据(曾试图用scan确定了那个rowkey的那个列簇的那个列的那个时间戳,任何通过这些信息用get进行取值,但是也不能返回value值),为什么结果的条数会发生变化呢?

1、filter

(1)录入的value是long型

如果想设置成数值型比较,则要进行数据类型设置,如下

Filter filter = new SingleColumnValueFilter(
             Bytes.toBytes("value"),Bytes.toBytes("null") , CompareOp.LESS,Bytes.toBytes(Long.valueOf(5)));
  scan.setFilter(filter);

resultScanner = table.getScanner(scan);

结果是:

rowkey                         列簇:列名 时间戳   value

115404869300388065  value:null     27

115404869300388065  value:null     26

但是如果设置成字符串行,如下:

Filter filter = new SingleColumnValueFilter(
Bytes.toBytes("value"),Bytes.toBytes("null") , CompareOp.LESS,Bytes.toBytes(”5“));
scan.setFilter(filter);

resultScanner = table.getScanner(scan);

则返回的是按照字典序比较的结果(ps:rowkey是按照字典序排列的,10000比2 “小”)

115404869300388065  value:null  27

115404869300388065  value:null  3

115404869300388065  value:null  2

115404869300388065  value:null  1

细心的话可以发现输出的几个也是按照降序的顺序排列的

【hbase】——bulk load导入数据时value=\x00\x00\x00\x01问题解析的更多相关文章

  1. [MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。

    利用load data将文件中的数据导入数据库表中的时候,遇到了两个问题. 首先是load data命令无法执行的问题: 命令行下输入load data local infile "path ...

  2. SQLSERVER:大容量导入数据时保留标识值 (SQL Server)

    从MSDN上看到实现大容量导入数据时保留标识值得方法包含三种: MSDN链接地址为:https://msdn.microsoft.com/zh-cn/library/ms178129.aspx 感觉M ...

  3. 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误

    1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...

  4. DB2导入数据时乱码问题

    1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入 LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016  ...

  5. SQL Server导入数据时“启用标示插入”详解

    在SQL Server中导入数据时,会有一个"启用标示插入"的选项,突然间懵逼了,这到底啥意思?我选与不选这个选项,结果好像没区别!不科学啊这,"存在即合理", ...

  6. 转 SSIS处理导入数据时, 存在的更新, 不存在的插入

    SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...

  7. MSSQL导入数据时,出现“无法截断表 因为表正由Foreign key引用”错误

    * 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] ”失败,错误如下:“无 ...

  8. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法

    注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...

  9. 导入数据时出现“SqlDateTime 溢出

    错误出现:导入数据时出现“SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间.” 出现这种问题多半是因为你插入或者更 ...

随机推荐

  1. 微信小程序探究

    前段时间比较流行的微信小程序,因为一直没有所谓内测码也没具体关注.拖到现在正好借组内分享的时机来仔细了解一下微信小程序.了解一个新的事物无外乎从是什么(本质),怎么用(具体用法),为什么用(优缺点)来 ...

  2. ie6,ie7,ie8 css bug兼容解决记录

    ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面 ...

  3. NPTL vs PThread

    NPTL vs PThread POSIX threads (pthread) is not an implementation, it is a API specification (a stand ...

  4. jQuery-1.9.1源码分析系列(一)整体架构续

    这一节主要是jQuery中最基础的几个东东 2.    jQuery的几个基础属性和函数 a. jQuery.noConflict函数详解 在jQuery初始化的时候保存了外部的$和jQuery _j ...

  5. 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密

    在数据库实现加密与解密的文章,Insus.NET较早前也有写过,可以在本博客中可以搜索得到. 今天使用EncryptByPassPhrase和DecryptByPassPhrase来简单实现. 在数据 ...

  6. jQuery网页版五子棋小游戏源码下载

    体验效果:http://hovertree.com/texiao/game/4/ 网页五子棋源代码: <!DOCTYPE html> <html> <head> & ...

  7. Redis 学习笔记(C#)

    Redis安装及简单操作 Windows下安装步骤: 1. 第一步当然是先下载咯~  地址:https://github.com/dmajkic/redis/downloads (根据自己实际情况选择 ...

  8. 背水一战 Windows 10 (15) - 动画: 缓动动画

    [源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...

  9. luogg_java学习_10_异常_反射

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 异常_反射 异常 异常就是导致程序中断执行的一段指令流 ...

  10. Spring注入中byType和byName的总结

    1.首先,区分清楚什么是byType,什么是byName. <bean id="userServiceImpl" class="cn.com.bochy.servi ...