【hbase】——bulk load导入数据时value=\x00\x00\x00\x01问题解析
一、存入数据类型
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问题解析的更多相关文章
- [MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。
利用load data将文件中的数据导入数据库表中的时候,遇到了两个问题. 首先是load data命令无法执行的问题: 命令行下输入load data local infile "path ...
- SQLSERVER:大容量导入数据时保留标识值 (SQL Server)
从MSDN上看到实现大容量导入数据时保留标识值得方法包含三种: MSDN链接地址为:https://msdn.microsoft.com/zh-cn/library/ms178129.aspx 感觉M ...
- 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...
- DB2导入数据时乱码问题
1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入 LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016 ...
- SQL Server导入数据时“启用标示插入”详解
在SQL Server中导入数据时,会有一个"启用标示插入"的选项,突然间懵逼了,这到底啥意思?我选与不选这个选项,结果好像没区别!不科学啊这,"存在即合理", ...
- 转 SSIS处理导入数据时, 存在的更新, 不存在的插入
SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...
- MSSQL导入数据时,出现“无法截断表 因为表正由Foreign key引用”错误
* 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] ”失败,错误如下:“无 ...
- 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法
注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...
- 导入数据时出现“SqlDateTime 溢出
错误出现:导入数据时出现“SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间.” 出现这种问题多半是因为你插入或者更 ...
随机推荐
- Oracle 11g 编译使用BBED
环境:RHEL 6.4 + Oracle 11.2.0.4 1. 拷贝缺失文件 2. 编译BBED 3. BBED使用测试 Reference 1. 拷贝缺失文件 11g中缺失几个相关文件,但我们实际 ...
- TSQL查询45道题
一.设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher). 四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1- ...
- SSE指令集优化学习:双线性插值
对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结. 1. 什么是SSE 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数 ...
- ASP.NET WEB API必知必会:特性路由
一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
- C#正则表达式Regex常用匹配
使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...
- 验证ASP.NET页生命周期时间的触发顺序
操作步骤: 在项目中创建文件lifeCycleValidation.aspx文件: 在文件lifeCycleValidation.aspx中添加代码,创建一个label控件,名字为lbText,代码如 ...
- 【Win10开发】Toast通知——前台激活
上篇文章我们将了大体的Toast通知的模板及实例展示,那么,这篇文章就来讲讲Toast的前台激活. 首先是xaml界面,很简单,我们放一个Button和TextBlock,TextBlock用来显示T ...
- 再次推荐一款逼真的HTML5下雪效果
再次推荐一款逼真的下雪效果 效果图: 效果描述:之前推荐过一款下雪的jQuery插件之前的那款下降速度比较缓慢,今天推荐的这个下降速度比较快,大雪哇 使用方法:1.将index.html中的样式复制到 ...
- C#如何静态调用C++中的方法(静态调用dll)
当我们想要在C#中使用C++项目的方法时,这个时候就可以通过调用C++项目的dll来实现,它有静态和动态调用两种方法. DLL(Dynamic Link Library)文件为动态链接库文件,又称“应 ...