分享

Hbase手动设置时间戳,无法删除数据,怎么办?

cloudcat 发表于 2016-9-21 17:20:05 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 20126
本帖最后由 cloudcat 于 2016-9-21 17:23 编辑

问题:如何实现,人为设置时间戳,录入多版本数据,也能根据rowkey删除数据?

公司业务:数据录入的时候,同一时刻,一条数据的某个字段存在多版本情况。
根据资料,hbase 插入数据的时候可以手动设置时间戳,这样把多个版本的时间戳区别开。
问题:手动设置时间戳,确实可以解决多版本问题。 但是根据rowkey ,用java api删除数据的时候 无法删除数据,不报错,返回也为true,但是hbase中依然存在

测试,每个cell的时间戳我取消人为设置,同样的删除代码数据可以删除,但是数据只存储最后一个版本,也许需要存入所有版本的数据。

代码:(有些类我自己封装了


//数据插入,人为不设置时间戳,数据能删除,但是不能录入多版本数据
put.add(Bytes.toBytes(colFamily.getColumnFamilyName()),
                            Bytes.toBytes(col.getColumnName()),
                            Bytes.toBytes(col.getValue()));   

//数据插入,人为设置时间戳,数据不能删除,但是能录入多版本数据
put.add(Bytes.toBytes(colFamily.getColumnFamilyName()),
               Bytes.toBytes(col.getColumnName()),
                col.getTimeStamp(), Bytes.toBytes(col.getValue()));






已有(5)人评论

跳转到指定楼层
nextuser 发表于 2016-9-21 18:00:14
本帖最后由 nextuser 于 2016-9-21 18:06 编辑

改时间戳,会带来很多问题。

首先对于楼主出现的问题,应该是自己封装的问题。

对于第一个问题:

//数据插入,人为不设置时间戳,数据能删除,但是不能录入多版本数据
put.add(Bytes.toBytes(colFamily.getColumnFamilyName()),
                            Bytes.toBytes(col.getColumnName()),
                            Bytes.toBytes(col.getValue()));   
认为不设置时间戳,数据是能删除和录入多版本数据的,这是毋庸置疑的。


对于第二个问题
//数据插入,人为设置时间戳,数据不能删除,但是能录入多版本数据
put.add(Bytes.toBytes(colFamily.getColumnFamilyName()),
               Bytes.toBytes(col.getColumnName()),
                col.getTimeStamp(), Bytes.toBytes(col.getValue()));


hbase自带的时间戳是精确到毫秒的.楼主可查看时间戳是否有相同的。务必自己生成具有唯一性的时间戳

建议把相关数据贴出来看下。





回复

使用道具 举报

nextuser 发表于 2016-9-21 18:02:24
推荐篇文章,希望对楼主有些帮助
hbase时间戳修改带来的问题总结


回复

使用道具 举报

cloudcat 发表于 2016-9-21 22:12:30
nextuser 发表于 2016-9-21 18:00
改时间戳,会带来很多问题。

首先对于楼主出现的问题,应该是自己封装的问题。

很感谢,你的回答,我今天分析了一下,产生时间戳的代码有问题,时间戳远大于当前时间的时间戳,所以导致删除失败。

回复

使用道具 举报

cloudcat 发表于 2016-9-21 22:13:04
nextuser 发表于 2016-9-21 18:02
推荐篇文章,希望对楼主有些帮助
hbase时间戳修改带来的问题总结

很感谢,你的回答,我今天分析了一下,产生时间戳的代码有问题,时间戳远大于当前时间的时间戳,所以导致删除失败。你的文章给了我很大的帮助,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条