一、获取一行的数据
get 'table', 'rowkey', 'cf:qualiter'
获取数据是通操作table来获取, 根据制定的rowkey获取对应的行数据result
通过Table.get(Get)获取Result
rs = table.get(get);
代码实现:
/**
* 通过rowkey查询数据
* @param tableName
* @param row rowkey
* @return
*/
public Result queryByRow(String tableName, byte[] row) {
//返回结果
Result rs = null;
//获取hbase库的连接
conn = getConn();
Table table = null;
try {
table = conn.getTable(TableName.valueOf(tableName));
Get get = new Get(row);
rs = table.get(get);
} catch (IOException e) {
e.printStackTrace();
}finally {
closeTable(table);
closeConn();
}
return rs;
}
测试:
/**
* 获取一个row的数据
*/
public static void get() {
HBaseDAO hBaseDAO = HBaseDAO.getInstance();
Result rs = hBaseDAO.queryByRow(tableName, rowkey1.getBytes());
Cell cell = rs.getColumnLatestCell(HBaseConfConstant.family, HBaseConfConstant.qualifier);
System.out.println(new String(cell.getValue()));
}
二、通过批量rowkey查询数据
通过Table.get(List gets)
这个方法获取批量的数据。
/**
* 通过批量rowkey查询数据
* @param tableName
* @param rows 批量rowkey
* @return
*/
public Result[] queryByRows(String tableName, List rows) {
Result[] rs = null;
conn = getConn();
Table table = null;
try {
table = conn.getTable(TableName.valueOf(tableName));
List gets = new ArrayList();
for (int i = 0; i < rows.size(); i++) {
Get get = new Get(rows.get(i));
gets.add(get);
}
rs = table.get(gets);
} catch (IOException e) {
e.printStackTrace();
}finally {
closeTable(table);
closeConn();
}
return rs;
}
测试:
/**
* 批量获取
*/
public static void getByRows() {
HBaseDAO hBaseDAO = HBaseDAO.getInstance();
List list = new ArrayList();
list.add(rowkey1.getBytes());
list.add(rowkey2.getBytes());
Result[] rs = hBaseDAO.queryByRows(tableName, list);
for (Result result : rs) {
Cell cell = result.getColumnLatestCell(HBaseConfConstant.family, HBaseConfConstant.qualifier);
System.out.println(new String(cell.getValue()));
}
}
三、通过Scan(byte[] startRow, byte[] stopRow)
首先要了解几个对象
3.1、Scan: 用于执行scan
操作的对象。
设置一个开始rowkey和一个endrowkey, hbase 中的数据是按照rowkey的字典ASCII排序的 ,这个必须重视, 我在测试的时候, 设置两个rowkey
static String rowkey1 = "5708A2.B1.B2-20100001_2101_221.130.189.6_735622241";
static String rowkey2 = "5608A2.B1.B2-20100001_2101_221.181.72.246_736059657";
但是在设置Scan的时候rowkey1为startRow, rowkey2为endkey, 发现总是无法查询到数据, 最后发现按照自然排序, rowkey1在后, 调换之后就可以了。
Scan scan = new Scan();
scan.setStartRow(startRow);
scan.setStopRow(stopRow);
通过table操作scan对象获取一个ResultScanner, 该对象就是一个Result的集合 public interface ResultScanner extends Closeable, Iterable
ResultScanner rScanner = table.getScanner(scan)
#通过遍历获取内容
Iterator irs = rScanner.iterator();
while (irs.hasNext()) {
Result rs = irs.next();
byte[] value = rs.getValue(HBaseConfConstant.family, HBaseConfConstant.qualifier);
System.out.println(new String(value));
}