市面上大部分的Hbase书籍都是针对0.98版本的,本次编辑采用1.2.X的操作
第一步 引入maven依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.8</version>
</dependency>
第二步 将hbase-site.xml 放入resources下
主要的操作类
Table 类
在Hbase 1.2.0 的时候,已经抛弃了Htable,全面使用的Table.当然获取方式也发生了变化
Configuration configuration = HBaseConfiguration.create();
Connection connection =ConnectionFactory.createConnection(configuration);
Table table =connection.getTable(TableName.valueOf("merchantTrade"));
Admin 类
Hbase中用来管理建表,改表,删除表等元数据操作
Configuration configuration = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(configuration);
//首先获取Admin
Admin admin =connection.getAdmin();
TableName tableName = TableName.valueOf("merchantTrade");
if(admin.tableExists(tableName)){
//判断表是否存在
System.out.println("##表存在了");
}else{
//如果表不存在话,创建表
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
//给表创建列族
HColumnDescriptor family = new HColumnDescriptor("Order");
//将列族加进去表中
hTableDescriptor.addFamily(family);
//创建表
admin.createTable(hTableDescriptor);
System.out.println("create table success"+tableName.getNameAsString());
}
admin.close();
CRUD操作
PUT 类
用于数据插入和修改,在1.2.x中使用
- addColumn(列族,列,值)
- table.checkAndPut() 是CAS操作,校验当前Hbase是否有和你指定数据一致
- put.has 用于快速检测数据是否存在
//往刚刚新建的地方插入数据
Configuration configuration = HBaseConfiguration.create();
try (Connection connection = ConnectionFactory.createConnection(configuration)) {
Table table = connection.getTable(TableName.valueOf("merchantTrade"));
Put put = new Put(Bytes.toBytes("34567890"));//这个是rowkey
String value = "zzjmay1245";
//添加单元格
//第一个参数列族,第二个参数
put.addColumn(Bytes.toBytes("Order"), Bytes.toBytes("orderId"), Bytes.toBytes(value));
//注意,因为在创建表的时候设置Version为1,所以Hbase存的都是最新的数据
table.put(put);
} catch (Exception e) {
e.printStackTrace();
}
Append 类
往指定行建的对应列尾部添加数据
- append(family,column,value)
- append(cell)
Get 类
顾名思义,就是用来查询的Hbase数据的
Get 中必须要设置rowkey,常用的方法
- addFamily()添加需要查询出来的列族
- addColumn(f,c) 添加需要查询出来的列族和列
Get get = new Get(Bytes.toBytes("9087678899"));
//通过设置类似的条件查询行中的部分列信息
//添加需要取出来的列族
get.addFamily(Bytes.toBytes("Order"));
Result result = table.get(get);
byte[] name = result.getValue(Bytes.toBytes("Order"),Bytes.toBytes("merchantOrderId"));
System.out.println("值:"+Bytes.toString(name));
get.addColumn(Bytes.toBytes("Order"),Bytes.toBytes("orderId"));
if(table.exists(get)) {
//exists可以减少网络消耗
Result result2 = table.get(get);
System.out.println(Bytes.toLong(result2.value()));
}
####RowMutation
任意多个Put和Delete操作,实现原子操作,类似数据库中的存储过程
批量操作
Hbase提供批量的方法进行Put,Get,Delete操作
只要传入对应的List< T >即可
//批量的插入
Configuration configuration = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("merchantTrade"));
List<Put> batchPuts = new ArrayList<>();
//进行批量的put操作
for(int i = 0;i<10;i++){
Put put =new Put(Bytes.toBytes("test"+i));
put.addColumn(Bytes.toBytes("Order"),Bytes.toBytes("merchantOrderId"),Bytes.toBytes(i));
batchPuts.add(put);
}
//执行批量操作
table.put(batchPuts);
//批量插入
List<Get> batchaGets = new ArrayList<>();
for(int i=0;i<10;i++){
Get get = new Get(Bytes.toBytes("test"+i));
get.addColumn(Bytes.toBytes("Order"),Bytes.toBytes("merchantOrderId"));
batchaGets.add(get);
}
//批量获取Get
Result[] results = table.get(batchaGets);
//获取Cell
for(Result result : results){
List<Cell> cellList = result.listCells();
//Cell 是有rowKey,列族,列的修饰符和时间戳组成
for(Cell cell:cellList){
System.out.println("列:"+ Bytes.toString(CellUtil.cloneQualifier(cell))+",值:"+ String.valueOf(Bytes.toInt(CellUtil.cloneValue(cell))));
}
}
注意:** 这里有个Cell类,是Hbase在摒弃了之前的数据结构KeyValue,新定义了接口,官方文档说了,Cell是rowkey,列族,列修饰符和版本号,确定唯一,Value是其值,客户端一般通过CellUtil进行Cell的字节操作 **
Scan
上面提到的Get,一般只能取出单条数据,但是如果我们想要获取一系列数据,我们就要用到scan,Scan类似于关系型数据库select,一般我们使用
**Scan(byte[] startRow,Filter filter)的方式进行获取数据 **
//扫描器的概念ResultScanner
Scan scan = new Scan(Bytes.toBytes("test0"));
//获取扫描器,这时候并没有去访问数据库,而是当循环遍历的时候才去访问hbase的
try( ResultScanner resultScanner = table.getScanner(scan)) {
for (Result r : resultScanner) {
List<Cell> cellList = r.listCells();
for (Cell cell:cellList) {
System.out.println(Bytes.toString(r.getRow())+"列:"+ Bytes.toString(CellUtil.cloneQualifier(cell))+",值:"+ String.valueOf(Bytes.toInt(CellUtil.cloneValue(cell))));
}
}
}catch (Exception e){
e.printStackTrace();
}
ResultScanner (扫描器)
需要注意的是,扫描器触发的时候才会去查hbase数据,获取的时候并没有访问Hbase
可以通过scan.setCaching(10);设置每次需要获取的数据条数,可以减少RPC请求