首页 文章

HBase获取单元格的所有带时间戳值

提问于
浏览
14

我的hbase实例中有以下场景

hbase(main):002:0> create 'test', 'cf'
0 row(s) in 1.4690 seconds

hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.1480 seconds

hbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0070 seconds

hbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0120 seconds

hbase(main):006:0> put 'test', 'row3', 'cf:c', 'value4'
0 row(s) in 0.0070 seconds

现在,如果您将看到,最后两个插入是针对相同的列族,相同的列和相同的键 . 但是,如果我正确理解hbase cf:c row3代表一个单元格,它将具有插入值的所有带时间戳的版本 .

但是简单的扫描只返回最近的值

hbase(main):010:0> scan 'test'       
ROW                   COLUMN+CELL                                               
 row1                 column=cf:a, timestamp=1317945279379, value=value1        
 row2                 column=cf:b, timestamp=1317945285731, value=value2        
 row3                 column=cf:c, timestamp=1317945301466, value=value4        
3 row(s) in 0.0250 seconds

如何获取单元格的所有带时间戳值,或如何执行基于时间范围的查询?

3 回答

  • 2

    要查看列的版本,您需要提供版本计数 .

    scan 'test', {VERSIONS => 3}
    

    如果可用,将为您提供2个版本的列 . 你可以用它来获取:

    get 'test', 'row3', {COLUMN => 'cf:c', VERSIONS => 3}
    

    为了获得特定时间的 Value ,你可以使用TIMESTAMP .

    get 'test', 'row3', {COLUMN => 'cf:c', TIMESTAMP => 1317945301466}
    

    如果你需要获取值"between" 2个时间戳,你应该使用TimestampsFilter .

  • 1

    要更改列族中允许的版本数,请使用以下命令:

    alter 'test', NAME=>'cf', VERSIONS=>2
    

    然后添加另一个条目:

    put 'test', 'row1', 'cf:a2', 'value1e'
    

    然后看到不同的版本:

    get 'test', 'row1', {COLUMN => 'cf:a2', VERSIONS => 2}
    

    会返回类似的东西:

    COLUMN                        CELL                                                                                
     cf:a2                        timestamp=1457947804214, value=value1e                                              
     cf:a2                        timestamp=1457947217039, value=value1d                                              
    2 row(s) in 0.0090 seconds
    

    以下是更多详细信息的链接:https://learnhbase.wordpress.com/2013/03/02/hbase-shell-commands/ .

  • 24

    cf:c的value4的行键'row3'应该是唯一的,否则会被覆盖:

    hbase(main):052:0> scan 'mytable' , {COLUMN => 'cf1:1', VERSION => 3}
    ROW                         COLUMN+CELL                                                                   
     1234                       column=cf1:1, timestamp=1405796300388, value=hello                            
    1 row(s) in 0.0160 seconds
    
    hbase(main):053:0> put 'mytable', 1234, 'cf1:1', 'wow!'
    0 row(s) in 0.1020 seconds
    

    具有值'hello'的cf1的第1列被第二个put用相同的行键1234和值'wow!'覆盖 .

    hbase(main):054:0> scan 'mytable', {COLUMN => 'cf1:1', VERSION => 3}
    ROW                   COLUMN+CELL                                               
     1234                 column=cf1:1, timestamp=1405831703617, value=wow!         
    2 row(s) in 0.0310 seconds
    

    现在第二个插入包含cf1第1列的新值'hey',最后3个版本的扫描查询现在显示'哇!'并且'嘿',请不要按降序显示版本 .

    hbase(main):055:0> put 'mytable', 123, 'cf1:1', 'hey'
    
    hbase(main):004:0> scan 'mytable', {COLUMN => 'cf1:1', VERSION => 3}
    ROW                   COLUMN+CELL                                               
     123                  column=cf1:1, timestamp=1405831295769, value=hey          
     1234                 column=cf1:1, timestamp=1405831703617, value=wow!
    

相关问题