HBASE中获取多个版本的值


在 HBase 中 一个 row 对应的相同的列只会有一行。使用 scan 或 get 得到都是最新的数据,如果我们对这某一 row 所对应的列进行了更改操作后,并不会多生成一条数据,不会像数据库一样,插入时多生成一条记录,在HBase中对同一条数据的修改或插入都只是put操作,最终看到的都是最新的数据,其它的数据在不同的version中保存,默认是隐藏的,通过时间戳区分,Hbase默认保存最近的三个版本,如何才能看到这些旧版本的数据了?

1. 插入测试数据

hbase(main):026:0> put 'test','row-1','info:col1','你好,中国'  
0 row(s) in 0.0200 seconds  

hbase(main):027:0> put 'test','row-1','info:col1','你好,广州'  
0 row(s) in 0.0130 seconds  

hbase(main):027:0> put 'test','row-1','info:col1','welcome,hbase'  
0 row(s) in 0.0130 seconds 

2. hbase shell 查询数据

  • 下面3个命令,只显示最近的三个版本
hbase(main):015:0> get 'test','row-1',{COLUMN=>'info:col1',VERSIONS=>10}
COLUMN              CELL
 info:col1      timestamp=1410943676361, value=welcome\xEF\xBC\x8Chbase
 info:col1      timestamp=1410942935244, value=\xE4...\x9E
 info:col1      timestamp=1410942917285, value=\xE4...\xBD
3 row(s) in 0.0270 seconds

hbase(main):016:0> scan 'test', {COLUMN=>'info:col1',VERSIONS=>10}
ROW       COLUMN+CELL
 row-1    column=info:col1, timestamp=1410943676361, value=welcome\xEF\xBC\x8Chbase                      
 row-1    column=info:col1, timestamp=1410942935244, value=\xE4...\x9E
 row-1    column=info:col1, timestamp=1410942917285, value=\xE4...\xBD
1 row(s) in 0.0300 seconds

hbase(main):017:0> scan 'test', {FILTER => "PrefixFilter ('row-1')",COLUMN=>'info:col1',VERSIONS=>10}
ROW     COLUMN+CELL
 row-1  column=info:col1, timestamp=1410943676361, value=welcome\xEF\xBC\x8Chbase
 row-1  column=info:col1, timestamp=1410942935244, value=\xE4...\x9E
 row-1  column=info:col1, timestamp=1410942917285, value=\xE4...\xBD
1 row(s) in 0.0220 seconds 
  • 下面2个命令,可以显示所有的版本
hbase(main):018:0> scan 'test',{FILTER => "(QualifierFilter (>=, 'binary:col1')))",RAW => true, VERSIONS => 10}
ROW      COLUMN+CELL
 row-1   column=info:col1, timestamp=1410943676361, value=welcome\xEF\xBC\x8Chbase
 row-1   column=info:col1, timestamp=1410942935244, value=\xE4\xBD...\x9E
 row-1   column=info:col1, timestamp=1410942917285, value=\xE4\xBD...\xBD
 row-1   column=info:col1, timestamp=1410936055137, value=\xE4\xB8...\x84
 row-1   column=info:col1, timestamp=1410936031157, value=\xE4\xB8...\x84
1 row(s) in 0.0290 seconds

hbase(main):019:0> scan 'test',{FILTER => "PrefixFilter ('row-1')",RAW => true, VERSIONS => 10}
ROW      COLUMN+CELL
 row-1   column=info:col1, timestamp=1410943676361, value=welcome\xEF\xBC\x8Chbase
 row-1   column=info:col1, timestamp=1410942935244, value=\xE4...\x9E
 row-1   column=info:col1, timestamp=1410942917285, value=\xE4...\xBD
 row-1   column=info:col1, timestamp=1410936055137, value=\xE4...\x84
 row-1   column=info:col1, timestamp=1410936031157, value=\xE4...\x84
 row-1   column=col2:col-0, timestamp=1410935938913, value=val-1.0
 row-1   column=col2:col-1, timestamp=1410935938921, value=val-1.1
 row-1   column=col2:col-2, timestamp=1410935938927, value=val-1.2
 row-1   column=col2:col-3, timestamp=1410935938929, value=val-1.3
 row-1   column=col2:col-4, timestamp=1410935938932, value=val-1.4
 row-1   column=col2:col-5, timestamp=1410935938935, value=val-1.5
 row-1   column=col2:col-6, timestamp=1410935938937, value=val-1.6
 row-1   column=col2:col-7, timestamp=1410935938939, value=val-1.7
 row-1   column=col2:col-8, timestamp=1410935938941, value=val-1.8
 row-1   column=col2:col-9, timestamp=1410935938944, value=val-1.9
1 row(s) in 0.0690 seconds  

3. 用java代码测试

import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.hbase.HBaseConfiguration;  
import org.apache.hadoop.hbase.client.Get;  
import org.apache.hadoop.hbase.client.HTable;  
import org.apache.hadoop.hbase.client.Result;  
import org.apache.hadoop.hbase.util.Bytes;  

import util.HBaseHelper;  

import java.io.IOException;  

import org.apache.hadoop.hbase.KeyValue;  

import java.util.List;  
public class GetExample {  

  public static void main(String[] args) throws IOException {  
    // vv GetExample  
    Configuration conf = HBaseConfiguration.create(); 
    conf.set("hbase.zookeeper.property.clientPort", "2181");    
    conf.set("hbase.zookeeper.quorum", "node1");    
    conf.set("zookeeper.znode.parent", "/hbase");  
    //vv GetExample  
    HTable table = new HTable(conf, "test");

    Get get = new Get(Bytes.toBytes("row-1")); 
    get.setMaxVersions();  
    get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("col1"));  
    Result result = table.get(get);  
    List<KeyValue> list = result.list();   
     for(final KeyValue kv:list){  
         System.out.println(
             String.format("row:%s, family:%s, qualifier:%s, qualifierValue:%s, timestamp:%s.",
                           Bytes.toString(kv.getRow()),
                           Bytes.toString(kv.getFamily()),
                           Bytes.toString(kv.getQualifier()),
                           Bytes.toString(kv.getValue()), 
                           kv.getTimestamp()
                          )
         );       
     }  
  }  
}  
// 输出结果:
// [sql] view plain copy
// row:row-1, family:info, qualifier:col1, qualifierValue:welcome,hbase, timestamp:1410943676361.  
// row:row-1, family:info, qualifier:col1, qualifierValue:你好,广州, timestamp:1410942935244.  
// row:row-1, family:info, qualifier:col1, qualifierValue:你好,中国, timestamp:1410942917285.  

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
HBase 中字段超时(TTL)的设置 HBase 中字段超时(TTL)的设置
定义TTL(Time to Live) 用于限定数据的超时时间。 设置TTL创建 test 表,列族 info, TTL设置86400秒过期 # 创建表 create 'test',{NAME => 'info', TTL=>'86400
2016-08-05
下一篇 
HBase 协处理器 endpoint 使用记录 HBase 协处理器 endpoint 使用记录
一.安装protoc链接:http://pan.baidu.com/s/1eSbOZXw 密码:agcd 1.从这里下载 protobuf-2.5.0.tar.gz 和 protoc-2.5.0-win32.zip 两个包。分别解压到各自目
2016-07-20
  目录