前言:本文介紹2種獲取列的多版本數據的方式:shell和spring data hadoop
一、hbase shell中如何獲取
1、在shell端創建一個Hbase表
[java] view plain copy
create 't1','f1'
2、查看錶結構
[java] view plain copy
describe 't1'
表結構如下:
[java] view plain copy
Table t1 is ENABLED
t1
COLUMN FAMILIES DESCRIPTION
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NON
E', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'
}
1 row(s) in 0.1370 seconds
從上面的表結構中,我們可以看到,VERSIONS爲1,也就是說,默認情況只會存取一個版本的列數據,當再次插入的時候,後面的值會覆蓋前面的值。
3、修改表結構,讓Hbase表支持存儲3個VERSIONS的版本列數據
[java] view plain copy
alter 't1',{NAME=>'f1',VERSIONS=>3}
修改後,shell終端顯示如下:
[java] view plain copy
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 2.5680 seconds
再次查看錶結構:
[java] view plain copy
Table t1 is ENABLED
t1
COLUMN FAMILIES DESCRIPTION
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '3', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NON
E', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'
}
1 row(s) in 0.0330 seconds
我們會發現VERSIONS已經修改成了3.
4、插入3行數據
[java] view plain copy
hbase(main):015:0> put 't1','rowkey1','f1:name','chhliu'
0 row(s) in 0.5890 seconds
hbase(main):016:0> put 't1','rowkey1','f1:name','xyh123'
0 row(s) in 0.1900 seconds
hbase(main):017:0> put 't1','rowkey1','f1:name','chhliuxyh'
0 row(s) in 0.1580 seconds
hbase(main):018:0> get 't1','rowkey1','f1:name'
COLUMN CELL
f1:name timestamp=1482820567560, value=chhliuxyh
1 row(s) in 0.2110 seconds
從上面可以看出,插入了3行數據到表中,並且3行數據的rowkey一致,然後使用get命令來獲取這一行數據,發現只返回了最新的一行數據。
5、獲取多行數據方法
[java] view plain copy
hbase(main):002:0> get 't1','rowkey1',{COLUMN=>'f1:name',VERSIONS=>3}
COLUMN CELL
f1:name timestamp=1482820567560, value=chhliuxyh
f1:name timestamp=1482820541363, value=xyh123
f1:name timestamp=1482820503889, value=chhliu
3 row(s) in 0.0960 seconds
從上面的測試結果中,可以看出,一次性獲取了3個版本的數據。
二、spring data hadoop獲取多版本信息
1、服務封裝如下:
[java] view plain copy
public List<String> get(final String tableName, final byte[] rowName, final String familyName,
final String qualifier) {
return htemplate.execute(tableName, new TableCallback<List<String>>() {
@Override
public List<String> doInTable(HTableInterface table) throws Throwable {
Get get = new Get(rowName);
get.setMaxVersions(3); // 設置一次性獲取多少個版本的數據
get.addColumn(familyName.getBytes(), qualifier.getBytes());
Result result = table.get(get);
List<Cell> cells = result.listCells();
String res = "";
List<String> list = new ArrayList<String>();
if(null != cells && !cells.isEmpty()){
for(Cell ce:cells){
res = Bytes.toString(ce.getValueArray(),
ce.getValueOffset(),
ce.getValueLength());
System.out.println("res:"+res+" timestamp:"+ce.getTimestamp());
list.add(res);
}
}
return list;
}
});
}
2、測試
[java] view plain copy
List<String> result = hService.get("t1", rowKey, "f1", "name");
System.out.println("result:"+result);
[java] view plain copy
res:chhliuxyh timestamp:1482820567560
res:xyh123 timestamp:1482820541363
res:chhliu timestamp:1482820503889
從上面的測試結果可以看出,同時獲取了3個版本的列信息
PS:spring data hadoop默認提供的接口中,是沒有提供一次性獲取多個版本的列信息的接口的,需要我們自己使用Hbase原生的API進行封裝。具體封裝方法,如上。