1 获取表数据/内容入门程序
public class TableDataTest01 {
public static void main(String[] args) throws IOException {
// 获取连接对象
Connection conn = HbaseUtil.getHbaseConnection();
// 获取一个表操作对象
Table tb_user = conn.getTable(TableName.valueOf("tb_user"));
// 获取一行内容
Get rk001 = new Get(Bytes.toBytes("rk001"));
// 获取指定的一行数据的多个单元格
Result result = tb_user.get(rk001);
// 循环遍历,将这些单元格全部取出来
while(result.advance()){
// 获取单元格的数据
Cell cell = result.current();
//获取行 列族 属性 属性的值 [单元格]
byte[] family = CellUtil.cloneFamily(cell);
byte[] qualifier = CellUtil.cloneQualifier(cell);
byte[] value = CellUtil.cloneValue(cell);
if("ages".equals(Bytes.toString(qualifier))){
System.out.println("rk001"+"->"+Bytes.toString(family)+"->"+Bytes.toString(qualifier)+"->"+Bytes.toInt(value));
}else {
System.out.println("rk001"+"->"+Bytes.toString(family)+"->"+Bytes.toString(qualifier)+"->"+Bytes.toString(value));
}
}
// 关闭连接
tb_user.close();
conn.close();
}
}
// 运行后结果如下
rk001->cf->age->18
rk001->cf->job->coder
rk001->cf->name->zss-demeimei
rk001->cf->sal->23k
2 get() 方法获取指定表的数据
public class GetTableData {
public static void main(String[] args) {
try {
// 获取连接对象
Connection connection = HbaseUtil.getHbaseConnection();
// 获取一行数据
getData1(connection);
// 获取多行数据
getData2(connection);
} catch (IOException e) {
e.printStackTrace();
}
}
// 获取一行数据
public static void getData1(Connection connection){
try {
// 获取表操作对象
Table tbuser = connection.getTable(TableName.valueOf("tb_user"));
// 创建一个get对象,并获得指定行的数据
Get get = new Get("rk001".getBytes());
// 获取一行数据 ,一行数据有很多单元格
Result result = tbuser.get(get);
// 调用展示数据方法打印数据
showData(result);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* get方法获取多行数据
* @param connection
*/
public static void getData2(Connection connection){
try {
// 获取表的操作对象
Table tb_user = connection.getTable(TableName.valueOf("tb_user"));
// 创建一个get对象,获取指定行的数据
Get get1 = new Get("rk001".getBytes());
Get get2 = new Get("rk002".getBytes());
// 创建集合,将多行数据存储在list集合里面
ArrayList<Get> list = new ArrayList<>();
// 将获取的多行数据添加到list集合中
list.add(get1);
list.add(get2);
// 获取查询到的多行数据
Result[] rowResults = tb_user.get(list);
// 遍历,将数据取出来
for (Result rowResult : rowResults) {
showData(rowResult);
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 展示数据
public static void showData(Result result){
if(result != null){
while (result.advance()){
// 获取单元格的数据
Cell cell = result.current();
// 获取行 列族 属性 属性的值 {单元格}
byte[] row = CellUtil.cloneRow(cell);
byte[] family = CellUtil.cloneFamily(cell);
byte[] qualifier = CellUtil.cloneQualifier(cell);
byte[] value = CellUtil.cloneValue(cell);
// 判断如果属性时 age ,就将将其转为整数类型
if("age".equals(Bytes.toString(qualifier))){
System.out.println(
Bytes.toString(row)+"->"+
Bytes.toString(family)+"->"+
Bytes.toString(qualifier)+"->"+
Bytes.toInt(value));
}else {
System.out.println(
Bytes.toString(row)+"->"+
Bytes.toString(family)+"->"+
Bytes.toString(qualifier)+"->"+
Bytes.toString(value));
}
}
}
}
}
3 scan() 方法获取指定表的数据
public class GetTableData {
public static void main(String[] args) {
try {
// 获取连接对象
Connection connection = HbaseUtil.getHbaseConnection();
// 获取指定表的指定列族的数据
scanColumnFamily(connection);
// 扫描全表得到指列族定指定属性的数据
scanColumnFamilyWithQualifier(connection);
// 扫描全表得到指定列族指定属性指定行范围的数据
scanFamilyWithQualifierAndValue(connection);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取某个列族的数据
* @param connection
*/
public static void scanColumnFamily(Connection connection){
try {
// 获取指定表对象
Table tb_user = connection.getTable(TableName.valueOf("tb_user"));
// 获取指定列族的数据
ResultScanner scanner = tb_user.getScanner(Bytes.toBytes("cf"));
Iterator<Result> iterator = scanner.iterator();
// 遍历数据,将数据取出来
while (iterator.hasNext()){
Result next = iterator.next();
showData(next);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取某个列族的某个属性
* @param connection
*/
public static void scanColumnFamilyWithQualifier(Connection connection){
try {
// 获取指定表
Table tb_user = connection.getTable(TableName.valueOf("tb_user"));
// 获得扫描对象
Scan scan = new Scan();
// 扫描指定的列族和其属性
scan.addColumn("cf".getBytes(),"name".getBytes());
// 指定表对象获取扫描对象指定的所有的数据
ResultScanner resultScanner = tb_user.getScanner(scan);
// 获取迭代器对象
Iterator<Result> iterator = resultScanner.iterator();
// 遍历迭代器,将所有的数据都取出来
while (iterator.hasNext()){
// 获取下一个结果
Result next = iterator.next();
showData(next);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 扫描整个表 ,查询指定表指定行的某个属性值
* @param connection
*/
public static void scanFamilyWithQualifierAndValue(Connection connection) {
try {
//获取table对象
Table tb_user = connection.getTable(TableName.valueOf("tb_user"));
// 全表扫描所有的数据
Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes("rk002")); // 包含这行
scan.withStopRow(Bytes.toBytes("rk005")); // 不包含这行
// 指定返回的列族和属性的值
scan.addColumn("cf".getBytes(),"name".getBytes());
ResultScanner resultScanner = tb_user.getScanner(scan);
Iterator<Result> iterator = resultScanner.iterator();
while (iterator.hasNext()){
Result result = iterator.next();
showData(result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void showData(Result result){
if(result != null){
while (result.advance()){
// 获取单元格的数据
Cell cell = result.current();
// 获取行 列族 属性 属性的值 {单元格}
byte[] row = CellUtil.cloneRow(cell);
byte[] family = CellUtil.cloneFamily(cell);
byte[] qualifier = CellUtil.cloneQualifier(cell);
byte[] value = CellUtil.cloneValue(cell);
// 判断如果属性时 age ,就将将其转为整数类型
if("age".equals(Bytes.toString(qualifier))){
System.out.println(
Bytes.toString(row)+"->"+
Bytes.toString(family)+"->"+
Bytes.toString(qualifier)+"->"+
Bytes.toInt(value));
}else {
System.out.println(
Bytes.toString(row)+"->"+
Bytes.toString(family)+"->"+
Bytes.toString(qualifier)+"->"+
Bytes.toString(value));
}
}
}
}
}
注意 : 获取表数据时 ,能用 get() 方法获取到指定数据就不要用 scan() 方法获取 .
1) get() 方法是确定了行健 ,然后根据行健取出指定的列族 / 属性 / 值进行分析查询 ,通过 rowkey 取值速度快 .
2) scan() 方法是全盘扫描 , 然后根据指定的条件筛选出指定的值 ,因为是要将整个表进行从头到尾的全部扫描 ,所以检索速度慢 ,效率低 (通过过滤器取值速度慢) .