一、存入数据类型

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. Anliven - 一碗毒鸡汤

    什么是你的核心动力,支撑着你持续前进? 什么是你的加速度,激发你全部的潜能和勇气? 你的核心动力应该来自于: 家人与朋友的信任.包容与期待 你本应承担的责任 对自己有所要求,有所期待,你本应更好 而你 ...

  2. jquery 图片轮播demo实现

    转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 图片轮播demo,弄清楚过程其实是一个很简单的东西,看网上都没有什么实质性的代码,就自己把过程捋了一遍实现了. 这次因为随手写的,所以没有做 ...

  3. [Java 安全]消息摘要与数字签名

    消息摘要 算法简述 定义 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生.如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知 ...

  4. CentOS下VMware用桥接模式,静态ip上外网

    15年的时候,写过一篇博客:VMware中网络设置之Bridged  也是关于linux下vmware桥接模式.静态ip上外网的配置,不过当时更多的是用图形界面来实现的,通用性不强.生产环境,极少有l ...

  5. RESTful API测试工具

    Postman Postman是一个Chrome APP,可以直接通过Chrome商店安装(需F墙,推荐修改hosts的方法,简便快捷有效) 其截图如下,非常漂亮 Aoizza Web APP,点击访 ...

  6. mysql 处理 NULL

    1.如果为空返回0 select ifnull(null,0) 2.如果为空返回0,否则返回1 select if(isnull(col),0,1) as col. MYSQL 中的IFNULL函数 ...

  7. Linux 定时任务crontab

    crontab定时任务格式 1 * * * * * command 2 第1列表示分钟1-59 每分钟用*或者 */1表示 3 第2列表示小时1-23(0表示0点) 4 第3列表示日期1-31 5 第 ...

  8. [转载] php用csv文件导出大量数据

    header ( "Content-type:application/vnd.ms-excel" ); header ( "Content-Disposition:fil ...

  9. Mac入门(一)基本用法

    我前五年一直外包到微软,每天使用的都是Windows系统和.NET. 2012年加入VMware,  公司的工作机是台Mac 笔记本(MacBook Pro), 所以有机会接触Mac系统 Mac和Wi ...

  10. Kerberos简介

    Kerberos协议: Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-grantin ...