7.獲取單行Get
如果希望獲取整行數(shù)據(jù),用行鍵初始化一個(gè)Get對(duì)象就可以,如果希望進(jìn)一步縮小獲取的數(shù)據(jù)范圍,可以使用Get對(duì)象的以下方法:
如果希望取得指定列族的所有列數(shù)據(jù),使用addFamily添加所有的目標(biāo)列族即可;
如果希望取得指定列的數(shù)據(jù),使用addColumn添加所有的目標(biāo)列即可;
如果希望取得目標(biāo)列的指定時(shí)間戳范圍的數(shù)據(jù)版本,使用setTimeRange;
如果僅希望獲取目標(biāo)列的指定時(shí)間戳版本,則使用setTimestamp;
如果希望限制每個(gè)列返回的版本數(shù),使用setMaxVersions;
如果希望添加過(guò)濾器,使用setFilter
下面詳細(xì)描述構(gòu)造函數(shù)及常用方法:
7.1.構(gòu)造函數(shù)
Get的構(gòu)造函數(shù)很簡(jiǎn)單,只有一個(gè)構(gòu)造函數(shù):Get(byte[] row) 參數(shù)是行鍵。
7.2.常用方法
Get addFamily (byte[] family) 指定希望獲取的列族
Get addColumn (byte[] family, byte[] qualifier) 指定希望獲取的列
Get setTimeRange (long minStamp, long maxStamp) 設(shè)置獲取數(shù)據(jù)的時(shí)間戳范圍
Get setTimeStamp (long timestamp) 設(shè)置獲取數(shù)據(jù)的時(shí)間戳
Get setMaxVersions (int maxVersions) 設(shè)定獲取數(shù)據(jù)的版本數(shù)
Get setMaxVersions() 設(shè)定獲取數(shù)據(jù)的所有版本
Get setFilter (Filter filter) 為Get對(duì)象添加過(guò)濾器,過(guò)濾器詳解請(qǐng)參見(jiàn):http://blog.csdn.net/u010967382/article/details/37653177
void setCacheBlocks (boolean cacheBlocks) 設(shè)置該Get獲取的數(shù)據(jù)是否緩存在內(nèi)存中
7.3.實(shí)測(cè)代碼
測(cè)試表的所有數(shù)據(jù):
hbase(main):016:0》 scan ‘rd_ns:leetable’
ROW COLUMN+CELL
100001 column=info:address, timestamp=1405304843114, value=longze
100001 column=info:age, timestamp=1405304843114, value=31
100001 column=info:name, timestamp=1405304843114, value=leon
100002 column=info:address, timestamp=1405305471343, value=caofang
100002 column=info:age, timestamp=1405305471343, value=30
100002 column=info:name, timestamp=1405305471343, value=show
100003 column=info:address, timestamp=1405407883218, value=qinghe
100003 column=info:age, timestamp=1405407883218, value=28
100003 column=info:name, timestamp=1405407883218, value=shichao
3 row(s) in 0.0250 seconds
(1)獲取行鍵指定行的所有列族、所有列的最新版本數(shù)據(jù)
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Get get = new Get(Bytes.toBytes(“100003”));
Result r = table.get(get);
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))
);
}
table.close();
代碼輸出:
Rowkey : 100003 Familiy:Quilifier : address Value : qinghe
Rowkey : 100003 Familiy:Quilifier : age Value : 28
Rowkey : 100003 Familiy:Quilifier : name Value : shichao
(2)獲取行鍵指定行中,指定列的最新版本數(shù)據(jù)
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Get get = new Get(Bytes.toBytes(“100003”));
get.addColumn(Bytes.toBytes(“info”), Bytes.toBytes(“name”));
Result r = table.get(get);
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))
);
}
table.close();
代碼輸出:
Rowkey : 100003 Familiy:Quilifier : name Value : shichao
(3)獲取行鍵指定的行中,指定時(shí)間戳的數(shù)據(jù)
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Get get = new Get(Bytes.toBytes(“100003”));
get.setTimeStamp(1405407854374L);
Result r = table.get(get);
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))
);
}
table.close();
代碼輸出了上面scan命令輸出中沒(méi)有展示的歷史數(shù)據(jù):
Rowkey : 100003 Familiy:Quilifier : address Value : huangzhuang
Rowkey : 100003 Familiy:Quilifier : age Value : 32
Rowkey : 100003 Familiy:Quilifier : name Value : lily
(4)獲取行鍵指定的行中,所有版本的數(shù)據(jù)
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:itable”);
Get get = new Get(Bytes.toBytes(“100003”));
get.setMaxVersions();
Result r = table.get(get);
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))+
“ Time : ”+cell.getTimestamp()
);
}
table.close();
代碼輸出:
Rowkey : 100003 Familiy:Quilifier : address Value : xierqi Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : address Value : shangdi Time : 1405417477465
Rowkey : 100003 Familiy:Quilifier : address Value : longze Time : 1405417448414
Rowkey : 100003 Familiy:Quilifier : age Value : 29 Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : age Value : 30 Time : 1405417477465
Rowkey : 100003 Familiy:Quilifier : age Value : 31 Time : 1405417448414
Rowkey : 100003 Familiy:Quilifier : name Value : leon Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : name Value : lee Time : 1405417477465
Rowkey : 100003 Familiy:Quilifier : name Value : lion Time : 1405417448414
?
8.獲取多行Scan
Scan對(duì)象可以返回滿足給定條件的多行數(shù)據(jù)。如果希望獲取所有的行,直接初始化一個(gè)Scan對(duì)象即可。如果希望限制掃描的行范圍,可以使用以下方法:
如果希望獲取指定列族的所有列,可使用addFamily方法來(lái)添加所有希望獲取的列族
如果希望獲取指定列,使用addColumn方法來(lái)添加所有列
通過(guò)setTimeRange方法設(shè)定獲取列的時(shí)間范圍
通過(guò)setTimestamp方法指定具體的時(shí)間戳,只返回該時(shí)間戳的數(shù)據(jù)
通過(guò)setMaxVersions方法設(shè)定最大返回的版本數(shù)
通過(guò)setBatch方法設(shè)定返回?cái)?shù)據(jù)的最大行數(shù)
通過(guò)setFilter方法為Scan對(duì)象添加過(guò)濾器,過(guò)濾器詳解請(qǐng)參見(jiàn):http://blog.csdn.net/u010967382/article/details/37653177
Scan的結(jié)果數(shù)據(jù)是可以緩存在內(nèi)存中的,可以通過(guò)getCaching()方法來(lái)查看當(dāng)前設(shè)定的緩存條數(shù),也可以通過(guò)setCaching(int caching)來(lái)設(shè)定緩存在內(nèi)存中的行數(shù),緩存得越多,以后查詢結(jié)果越快,同時(shí)也消耗更多內(nèi)存。此外,通過(guò)setCacheBlocks方法設(shè)置是否緩存Scan的結(jié)果數(shù)據(jù)塊,默認(rèn)為true
我們可以通過(guò)setMaxResultSize(long)方法來(lái)設(shè)定Scan返回的結(jié)果行數(shù)。
下面是官網(wǎng)文檔中的一個(gè)入門(mén)示例:假設(shè)表有幾行鍵值為 “row1”, “row2”, “row3”,還有一些行有鍵值 “abc1”, “abc2”, 和 “abc3”,目標(biāo)是返回“row”打頭的行:
HTable htable = 。.. // instantiate HTable
Scan scan = new Scan();
scan.addColumn(Bytes.toBytes(“cf”),Bytes.toBytes(“attr”));
scan.setStartRow( Bytes.toBytes(“row”)); // start key is inclusive
scan.setStopRow( Bytes.toBytes(“row” + (char)0)); // stop key is exclusive
ResultScanner rs = htable.getScanner(scan);
try {
for (Result r = rs.next(); r != null; r = rs.next()) {
// process result.。.
} finally {
rs.close(); // always close the ResultScanner!
}
8.1.常用構(gòu)造函數(shù)
(1)創(chuàng)建掃描所有行的Scan
Scan()
(2)創(chuàng)建Scan,從指定行開(kāi)始掃描,
Scan(byte[] startRow)
參數(shù):startRow行鍵
注意:如果指定行不存在,從下一個(gè)最近的行開(kāi)始
(3)創(chuàng)建Scan,指定起止行
Scan(byte[] startRow, byte[] stopRow)
參數(shù):startRow起始行,stopRow終止行
注意:startRow 《= 結(jié)果集 《 stopRow
(4)創(chuàng)建Scan,指定起始行和過(guò)濾器
Scan(byte[] startRow, Filter filter)
參數(shù):startRow起始行,filter過(guò)濾器
注意:過(guò)濾器的功能和構(gòu)造參見(jiàn)http://blog.csdn.net/u010967382/article/details/37653177
8.2.常用方法
Scan setStartRow(byte[] startRow) 設(shè)置Scan的開(kāi)始行,默認(rèn)結(jié)果集包含該行。如果希望結(jié)果集不包含該行,可以在行鍵末尾加上0。
Scan setStopRow(byte[] stopRow) 設(shè)置Scan的結(jié)束行,默認(rèn)結(jié)果集不包含該行。如果希望結(jié)果集包含該行,可以在行鍵末尾加上0。
Scan setTimeRange(long minStamp, long maxStamp) 掃描指定時(shí)間范圍的數(shù)據(jù)
Scan setTimeStamp(long timestamp) 掃描指定時(shí)間的數(shù)據(jù)
Scan addColumn(byte[] family, byte[] qualifier) 指定掃描的列
Scan addFamily(byte[] family) 指定掃描的列族
Scan setFilter(Filter filter) 為Scan設(shè)置過(guò)濾器
Scan setReversed(boolean reversed) 設(shè)置Scan的掃描順序,默認(rèn)是正向掃描(false),可以設(shè)置為逆向掃描(true)。注意:該方法0.98版本以后才可用??!
Scan setMaxVersions() 獲取所有版本的數(shù)據(jù)
Scan setMaxVersions(int maxVersions) 設(shè)置獲取的最大版本數(shù)
void setCaching(int caching) 設(shè)定緩存在內(nèi)存中的行數(shù),緩存得越多,以后查詢結(jié)果越快,同時(shí)也消耗更多內(nèi)存
void setRaw(boolean raw) 激活或者禁用raw模式。如果raw模式被激活,Scan將返回所有已經(jīng)被打上刪除標(biāo)記但尚未被真正刪除的數(shù)據(jù)。該功能僅用于激活了KEEP_DELETED_ROWS的列族,即列族開(kāi)啟了hcd.setKeepDeletedCells(true)。Scan激活raw模式后,就不能指定任意的列,否則會(huì)報(bào)錯(cuò)
Enable/disable “raw” mode for this scan. If “raw” is enabled the scan will return all delete marker and deleted rows that have not been collected, yet. This is mostly useful for Scan on column families that have KEEP_DELETED_ROWS enabled. It is an error to specify any column when “raw” is set.
hcd.setKeepDeletedCells(true);
8.3.實(shí)測(cè)代碼
(1)掃描表中的所有行的最新版本數(shù)據(jù)
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:itable”);
Scan s = new Scan();
ResultScanner rs = table.getScanner(s);
for (Result r : rs) {
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))+
“ Time : ”+cell.getTimestamp()
);
}
}
table.close();
代碼輸出:
Rowkey : 100001 Familiy:Quilifier : address Value : anywhere Time : 1405417403438
Rowkey : 100001 Familiy:Quilifier : age Value : 24 Time : 1405417403438
Rowkey : 100001 Familiy:Quilifier : name Value : zhangtao Time : 1405417403438
Rowkey : 100002 Familiy:Quilifier : address Value : shangdi Time : 1405417426693
Rowkey : 100002 Familiy:Quilifier : age Value : 28 Time : 1405417426693
Rowkey : 100002 Familiy:Quilifier : name Value : shichao Time : 1405417426693
Rowkey : 100003 Familiy:Quilifier : address Value : xierqi Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : age Value : 29 Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : name Value : leon Time : 1405417500485
(2)掃描指定行鍵范圍,通過(guò)末尾加0,使得結(jié)果集包含StopRow
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:itable”);
Scan s = new Scan();
s.setStartRow(Bytes.toBytes(“100001”));
s.setStopRow(Bytes.toBytes(“1000020”));
ResultScanner rs = table.getScanner(s);
for (Result r : rs) {
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))+
“ Time : ”+cell.getTimestamp()
);
}
}
table.close();
代碼輸出:
Rowkey : 100001 Familiy:Quilifier : address Value : anywhere Time : 1405417403438
Rowkey : 100001 Familiy:Quilifier : age Value : 24 Time : 1405417403438
Rowkey : 100001 Familiy:Quilifier : name Value : zhangtao Time : 1405417403438
Rowkey : 100002 Familiy:Quilifier : address Value : shangdi Time : 1405417426693
Rowkey : 100002 Familiy:Quilifier : age Value : 28 Time : 1405417426693
Rowkey : 100002 Familiy:Quilifier : name Value : shichao Time : 1405417426693
(3)返回所有已經(jīng)被打上刪除標(biāo)記但尚未被真正刪除的數(shù)據(jù)
本測(cè)試針對(duì)rd_ns:itable表的100003行。
如果使用get結(jié)合setMaxVersions()方法能返回所有未刪除的數(shù)據(jù),輸出如下:
Rowkey : 100003 Familiy:Quilifier : address Value : huilongguan Time : 1405494141522
Rowkey : 100003 Familiy:Quilifier : address Value : shangdi Time : 1405417477465
Rowkey : 100003 Familiy:Quilifier : age Value : new29 Time : 1405494141522
Rowkey : 100003 Familiy:Quilifier : name Value : liyang Time : 1405494141522
然而,使用Scan強(qiáng)大的s.setRaw(true)方法,可以獲得所有已經(jīng)被打上刪除標(biāo)記但尚未被真正刪除的數(shù)據(jù)。
代碼如下:
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:itable”);
Scan s = new Scan();
s.setStartRow(Bytes.toBytes(“100003”));
s.setRaw(true);
s.setMaxVersions();
ResultScanner rs = table.getScanner(s);
for (Result r : rs) {
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))+
“ Time : ”+cell.getTimestamp()
);
}
}
table.close();
輸出結(jié)果如下:
Rowkey : 100003 Familiy:Quilifier : address Value : huilongguan Time : 1405494141522
Rowkey : 100003 Familiy:Quilifier : address Value : Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : address Value : xierqi Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : address Value : shangdi Time : 1405417477465
Rowkey : 100003 Familiy:Quilifier : address Value : Time : 1405417448414
Rowkey : 100003 Familiy:Quilifier : address Value : longze Time : 1405417448414
Rowkey : 100003 Familiy:Quilifier : age Value : new29 Time : 1405494141522
Rowkey : 100003 Familiy:Quilifier : age Value : Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : age Value : Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : age Value : 29 Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : age Value : 30 Time : 1405417477465
Rowkey : 100003 Familiy:Quilifier : age Value : 31 Time : 1405417448414
Rowkey : 100003 Familiy:Quilifier : name Value : liyang Time : 1405494141522
Rowkey : 100003 Familiy:Quilifier : name Value : Time : 1405493879419
Rowkey : 100003 Familiy:Quilifier : name Value : leon Time : 1405417500485
Rowkey : 100003 Familiy:Quilifier : name Value : lee Time : 1405417477465
Rowkey : 100003 Familiy:Quilifier : name Value : lion Time : 1405417448414
(4)結(jié)合過(guò)濾器,獲取所有age在25到30之間的行
目前的數(shù)據(jù):
hbase(main):049:0》 scan ‘rd_ns:itable’
ROW COLUMN+CELL
100001 column=info:address, timestamp=1405417403438, value=anywhere
100001 column=info:age, timestamp=1405417403438, value=24
100001 column=info:name, timestamp=1405417403438, value=zhangtao
100002 column=info:address, timestamp=1405417426693, value=shangdi
100002 column=info:age, timestamp=1405417426693, value=28
100002 column=info:name, timestamp=1405417426693, value=shichao
100003 column=info:address, timestamp=1405494141522, value=huilongguan
100003 column=info:age, timestamp=1405494999631, value=29
100003 column=info:name, timestamp=1405494141522, value=liyang
3 row(s) in 0.0240 seconds
代碼:
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:itable”);
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
Bytes.toBytes(“info”),
Bytes.toBytes(“age”),
CompareOp.GREATER_OR_EQUAL,
Bytes.toBytes(“25”)
);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
Bytes.toBytes(“info”),
Bytes.toBytes(“age”),
CompareOp.LESS_OR_EQUAL,
Bytes.toBytes(“30”)
);
filterList.addFilter(filter1);
filterList.addFilter(filter2);
Scan scan = new Scan();
scan.setFilter(filterList);
ResultScanner rs = table.getScanner(scan);
for (Result r : rs) {
for (Cell cell : r.rawCells()) {
System.out.println(
“Rowkey : ”+Bytes.toString(r.getRow())+
“ Familiy:Quilifier : ”+Bytes.toString(CellUtil.cloneQualifier(cell))+
“ Value : ”+Bytes.toString(CellUtil.cloneValue(cell))+
“ Time : ”+cell.getTimestamp()
);
}
}
table.close();
代碼輸出:
Rowkey : 100002 Familiy:Quilifier : address Value : shangdi Time : 1405417426693
Rowkey : 100002 Familiy:Quilifier : age Value : 28 Time : 1405417426693
Rowkey : 100002 Familiy:Quilifier : name Value : shichao Time : 1405417426693
Rowkey : 100003 Familiy:Quilifier : address Value : huilongguan Time : 1405494141522
Rowkey : 100003 Familiy:Quilifier : age Value : 29 Time : 1405494999631
Rowkey : 100003 Familiy:Quilifier : name Value : liyang Time : 1405494141522
注意:
HBase對(duì)列族、列名大小寫(xiě)敏感
評(píng)論
查看更多