开发者社区 问答 正文

hbase 读取数据时只能查看最后一次的数据:报错

我的问题是这样的:我的表名:login, 列簇:info,列名是:info:username, info:logintime,当我第一次插入数据:

put 'login','22233','info:username','lilei' ;

put 'login','22233','info:logintime','2017-12-10:12:00:23'

过了一段时间 我再插入同一个rowkey值,如下:

put 'login','22233','info:username','lilei' ;

put 'login','22233','info:logintime','2017-12-10:12:20:23'

我搜索所有的记录:scen 'login' 只显示了最后一次的数据,第一次的数据没有查询到

我要如何才能显示两次的数据,我是刚接触hbase。这里的一个cell理论是有两条内容了吧,是第二次的数据将第一次的数据覆盖了还是我的查询方法不对

展开
收起
kun坤 2020-06-06 23:16:15 610 分享 版权
阿里云 AI 助理回答

在HBase中,每个单元格(Cell)是由行键(Row Key)、列族(Column Family)、列限定符(Column Qualifier)和时间戳(Timestamp)唯一确定的。当你第二次插入具有相同行键、列簇和列名的数据时,实际上你是在更新同一个单元格的内容,而不是创建一个新的记录。默认情况下,新的数据会覆盖原有数据,除非你在写入时指定了不同的时间戳或者使用了其他策略来存储多个版本。

如果你想保留多次写入的数据并能查询到它们,你可以通过以下方式实现:

  1. 启用多版本:HBase允许为每个列族设置最大版本数。这意味着你可以为info列簇设置一个大于1的最大版本数,这样每次写入相同单元格的新数据时,旧数据不会被立即删除,直到达到版本数限制。可以通过修改表的元数据来实现这一点,例如:

    alter 'login', {NAME => 'info', VERSIONS => 2} # 设置info列簇最多保存2个版本的数据
    

    这样设置后,当你再次执行查询时,将会看到最近两次的写入记录。

  2. 指定时间戳:在写入数据时,可以手动指定时间戳,这样即使不修改版本设置,也能确保不同时间点的数据被分别存储。但请注意,这需要你在写入数据时精确控制时间戳值:

    put 'login','22233','info:username','lilei', ts=>1512930023000 # 使用自定义的时间戳
    
  3. 查询时指定时间范围或版本:如果你已经启用了多版本,可以通过在scan命令中指定时间戳范围或版本号来查看特定版本的数据:

    scan 'login', {COLUMNS=>'info:username', VERSIONS=>2} # 查看info:username列的最后两个版本
    scan 'login', {COLUMNS=>'info:username', TIMERANGE => [1512930023000, 1512930143000]} # 查看指定时间范围内的数据
    

综上所述,你的数据确实被第二次写入覆盖了,要显示多次的数据,你需要调整列族的版本设置或在写入及查询时采用上述策略。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答