Hbase JavaAPI操作 基于1.2.x版本

市面上大部分的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下

Hbase JavaAPI操作 基于1.2.x版本_第1张图片

主要的操作类

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中使用

  1. addColumn(列族,列,值)
  2. table.checkAndPut() 是CAS操作,校验当前Hbase是否有和你指定数据一致
  3. 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 类

往指定行建的对应列尾部添加数据

  1. append(family,column,value)
  2. append(cell)

Get 类

顾名思义,就是用来查询的Hbase数据的
Get 中必须要设置rowkey,常用的方法

  1. addFamily()添加需要查询出来的列族
  2. 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请求

你可能感兴趣的:(Hbase)