HBase的API操作

详细操作:相关代码

import javafx.scene.control.Tab;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import javax.xml.stream.events.Namespace;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

/**
 * @ClassName: HbaseDemo
 * @Description:
 * @Author: kele
 * @Date: 2021/2/22 10:04
 **/

public class HbaseDemo {

    public Admin admin = null;
    public Connection connection;

    @Before
    //创建连接
    public void before() throws IOException {

        Configuration conf = HBaseConfiguration.create();

        conf.set("hbase.zookeeper.quorum","hadoop102:2181,hadoop103:2181,hadoop104:2181");

        connection = ConnectionFactory.createConnection(conf);

        admin = connection.getAdmin();
    }

    //关闭连接
    @After
    public void after(){

        try {
            if(connection != null)
                connection.close();
            if(admin != null)
                admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


 /******************************************命名空间操作*****************************************************************************/

    /**
     * namespace操作和ddl操作使用的是admin对象
     */

 /**
     * 创建namespace对象
     */
    @Test
    public void createNameSpace() throws IOException {

        //创建命名空间描述
        NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create("bigdata2").build();

        admin.createNamespace(namespaceDescriptor);
    }

    /**
     * 查看所有命名空间
     */
    @Test
    public void listNameSpace() throws IOException {

        NamespaceDescriptor[] descriptors = admin.listNamespaceDescriptors();

        for(NamespaceDescriptor descriptor : descriptors){

            String name = descriptor.getName();
            System.out.println(name);
        }
    }

    /**
     * 查看某个namespace的描述
     */

    @Test
    public void describeNamespace() throws IOException {

        NamespaceDescriptor bigdata2 = admin.getNamespaceDescriptor("bigdata");

        System.out.println(bigdata2.getName());

    }

    /**
     * 查看命名空间下所有的表
     */
    @Test
    public void NameSpaceTables() throws IOException {

        //查看所有在所有命名空间下的所有的表

        /* TableName[] tableNames = admin.listTableNames();

            for(TableName tablename:tableNames){
                System.out.println(tablename.getNameAsString());
            }
        */

     //获取某个库下所有表的信息
        List<TableDescriptor> tableDescriptorList = admin.listTableDescriptorsByNamespace("bigdata2".getBytes());

        for(TableDescriptor tableDescriptor : tableDescriptorList){
            System.out.println(tableDescriptor.getTableName().getNameAsString());
        }

    }

    /**
     * 删除namespace
     * 1、先失效namespace下的所有表
     * 2、删除namespace下的所有表
     * 3、删除namespace
     * @throws IOException
     */
    @Test
    public void dropNamespce() throws IOException {

        List<TableDescriptor> tableDescriptors = admin.listTableDescriptorsByNamespace("bigdata2".getBytes());

        for (TableDescriptor tableDescriptor : tableDescriptors) {
            //失效表
            admin.disableTable(tableDescriptor.getTableName());
            //删除表
            admin.deleteTable(tableDescriptor.getTableName());
        }

        //删除命名空间
        admin.deleteNamespace("bigdata2");
    }

 /************************************************table操作 DDL*******************************************************************/

    /**
     * 创建表
     * @throws IOException
     */

   @Test
    public void createtable() throws IOException {

       //配置列族描述
       ColumnFamilyDescriptor f1 = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes())
               //设置版本个数
               .setMaxVersions(2)
               .build();
       ColumnFamilyDescriptor f2 = ColumnFamilyDescriptorBuilder.newBuilder("f2".getBytes())
               .build();

       List<ColumnFamilyDescriptor> f = new ArrayList<>();
       f.add(f1);
       f.add(f2);

       //2、通过工厂类创建对象
       TableDescriptor tdb = TableDescriptorBuilder.newBuilder(TableName.valueOf("bigdata2:student3"))
               //设置列族
               .setColumnFamilies(f)
               .build();

       //1、创建表,需要传入TableDescriptor
      //admin.createTable(tdb);

      //预分区创建表方式一
       //admin.createTable(tdb,"10".getBytes(),"30".getBytes(),4);

       //预分区创建表方式二
       byte[][] b = new byte[][]{"100".getBytes(),"200".getBytes()};
       admin.createTable(tdb,b);
    }

    /**
     *修改表
     */
    @Test
    public void alterTable() throws IOException {

        /**
         * 声明修改的部分修改,未声明的部分不修改
         * modifyColumnFamily
         */

        /* TableName name = TableName.valueOf("bigdata2:student");
        ColumnFamilyDescriptor columnFamilyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes())
                .setMaxVersions(5)
                .build();

        admin.modifyColumnFamily(name,columnFamilyDescriptor);*/

        /**
         * 修改格式为定义的修改,  //本例中只保留f1的列族,其余的会删除
         * modifyTable
         */
        ColumnFamilyDescriptor columnFamilyDescriptor = ColumnFamilyDescriptorBuilder
                .newBuilder("f1".getBytes())
                .setMaxVersions(5).build();

        TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(TableName.valueOf("bigdata2:student"))
                .setColumnFamily(columnFamilyDescriptor)
                .build();

        admin.modifyTable(tableDescriptor);
    }


    /**
     * 删除表
     */

    @Test
    public void dropTable() throws IOException {

        if(admin.tableExists(TableName.valueOf("bigdata:student"))){
            //禁用表
            admin.disableTable(TableName.valueOf("bigdata:student"));
            //删除表
            admin.deleteTable(TableName.valueOf("bigdata:student"));
        }
    }



    /************************************************数据操作 DML*******************************************************************/

    //DML操作需要使用connection对象

    /*************
     * 插入数据
     * @throws IOException
     */
    @Test
    public void putdata() throws IOException {

        //1、获取表
        Table table = connection.getTable(TableName.valueOf("bigdata2:student"));

        Put put = new Put("1000".getBytes());
        put.addColumn("f1".getBytes(),"name".getBytes(),"zhangsan".getBytes());
        put.addColumn("f1".getBytes(),"age".getBytes(), Bytes.toBytes(20));
        put.addColumn("f1".getBytes(),"add".getBytes(),"shenzhen".getBytes());

        //2、向表中添加数据
        table.put(put);

        //3、关闭表
        table.close();
    }


    /**
     * 集体添加数据
     * @throws IOException
     */
    @Test
    public void putdatas() throws IOException {

        Random random = new Random();

        //1、获取连接对象
        Table table = connection.getTable(TableName.valueOf("bigdata2:student"));

        List<Put> puts = new ArrayList<Put>();

        for (int i = 0; i < 8; i++) {

            Put put = new Put(("100"+i).getBytes());
            put.addColumn("f1".getBytes(),"name".getBytes(),("zhang"+i).getBytes());
            put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(random.nextInt(99)+1));
            put.addColumn("f1".getBytes(),"address".getBytes(),("shenzhen-"+i).getBytes());

            puts.add(put);
        }

        table.put(puts);

        table.close();
    }

    /**
     * 查询数据
     * @throws IOException
     */
    @Test
    public void getdata() throws IOException {

        Table table = connection.getTable(TableName.valueOf("bigdata2:student"));

        Get get = new Get("1001".getBytes());
        //查询某个列族
         //get.addFamily("f1".getBytes());
        //查询某个列
        get.addColumn("f1".getBytes(),"name".getBytes());
        get.readVersions(3);

        Result result = table.get(get);

        List<Cell> cells = result.listCells();

        for (Cell cell : cells) {
            /**
             * 由于数据是一整行返回的,所以在查询时,通过三个参数获取数据
             * Array:返回的数据
             * length:某段数据的长度
             * offset:某段数据的起始位置
             */

            //获取cell的列族
            String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());

            //获取cell的列限定符
           String qualify = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());

            //获取rowkey的值
            String rowkey = new String(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());

            //获取cell的值
            if("f1".equals(family) && "age".equals(qualify)){

                int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);

            }else{
                String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
            }
        }
    }


    /*********************
     * 全局查询
     */
    @Test
    public void scanData() throws IOException {

        //1、获取连接
        Table table = connection.getTable(TableName.valueOf("bigdata2:student"));

        Scan scan = new Scan();

        //查询某个列族
        //scan.addFamily("f1".getBytes());

        //查询某个列限定符的
        scan.addColumn("f1".getBytes(),"name".getBytes());

        //查询多个版本
        scan.readVersions(2);


        //按照范围查询
        scan.withStartRow("1005".getBytes(),true);

        //2、获取全局查询
        ResultScanner scanner = table.getScanner(scan);

        Iterator<Result> iterator = scanner.iterator();

        while(iterator.hasNext()){

            Result row = iterator.next();

            List<Cell> cells = row.listCells();

            for (Cell cell : cells) {

                //方式一
              /*
                //获取cell的列族
                String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());

                //获取cell的列限定符
                String qualify = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());

                //获取rowkey的值
                String rowkey = new String(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());

                //获取cell的值
                if("f1".equals(family) && "age".equals(qualify)){

                    int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);

                }else{
                    String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
                }
                */

                /**
                 * 方式二:使用cellUtil的方式,更加简单
                 */
                //获取列族
                String family = new String(CellUtil.cloneFamily(cell));

                //获取列限定符
                String qualify = new String(CellUtil.cloneQualifier(cell));

                //获取row
                String rowkey = new String(CellUtil.cloneRow(cell));

                if("f1".equals(family) && "age".equals(qualify)){

                    int value = Bytes.toInt(CellUtil.cloneValue(cell));
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);

                }else{
                    String value = new String(CellUtil.cloneValue(cell));
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
                }
            }
        }
    }


    /**
     * 过滤查询
     * 实现mysql中的where、like、where 条件 and 条件 or 条件
     */

    @Test
    public void file() throws IOException {

        //1、获取连接
        Table table = connection.getTable(TableName.valueOf("bigdata2:student"));

        Scan scan = new Scan();


        /**##########通过setFilter进行过滤,相当于mysql中的where查询
         * 判断是否为某一确定值
         */
        /*
/*
        //如果限定符写未定义的,则查询结果为所有值
        SingleColumnValueFilter filter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL, "zhang1".getBytes());
        scan.setFilter(filter);
*/

        /**##############
         * 类似于mysql中的like(模糊)查询
         */

/*        SubstringComparator lisi = new SubstringComparator("lisi");
        SingleColumnValueFilter filter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL, lisi);

        scan.setFilter(filter);
*/
        /**##############
         * where 条件 and 条件 or 条件
         *
         * where(name == ‘lisi1’ and age == 66) or name == 'zhang3'
         */
        //条件1:查询名字带有lisi的
        SingleColumnValueFilter filter1 = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL,"lisi1".getBytes());

        //条件2:查询年龄是66的
        SingleColumnValueFilter filter2 = new SingleColumnValueFilter("f1".getBytes(), "age".getBytes(), CompareOperator.EQUAL,Bytes.toBytes(66));

        //合并条件1、2
        FilterList lisiAnd66 = new FilterList(FilterList.Operator.MUST_PASS_ALL,filter1,filter2);

        //条件3:查询名字是zhang3
        SingleColumnValueFilter filter3 = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL,"zhang3".getBytes());

        //合并条件1、2、3
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE,lisiAnd66,filter3);

        scan.setFilter(filterList);



        //2、获取全局查询
        ResultScanner scanner = table.getScanner(scan);

        Iterator<Result> iterator = scanner.iterator();

        while(iterator.hasNext()){

            Result row = iterator.next();

            List<Cell> cells = row.listCells();

            for (Cell cell : cells) {

                //方式一
              /*
                //获取cell的列族
                String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());

                //获取cell的列限定符
                String qualify = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());

                //获取rowkey的值
                String rowkey = new String(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());

                //获取cell的值
                if("f1".equals(family) && "age".equals(qualify)){

                    int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);

                }else{
                    String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
                }
                */

                /**
                 * 方式二:使用cellUtil的方式,更加简单
                 */
                //获取列族
                String family = new String(CellUtil.cloneFamily(cell));

                //获取列限定符
                String qualify = new String(CellUtil.cloneQualifier(cell));

                //获取row
                String rowkey = new String(CellUtil.cloneRow(cell));

                if("f1".equals(family) && "age".equals(qualify)){

                    int value = Bytes.toInt(CellUtil.cloneValue(cell));
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);

                }else{
                    String value = new String(CellUtil.cloneValue(cell));
                    System.out.println("rowkey:"+rowkey+",family:"+family+",qualify:"+qualify+",value:"+value);
                }
            }
        }

    }





/***********************************************************************************************************/
    /**
     *  清空表
     *
     *  清空表之前要先禁用表,处理对数据的操作,其他的都使用admin
     */
    @Test
    public void truncateData() throws IOException {

        admin.disableTable(TableName.valueOf("bigdata2:student"));

        admin.truncateTable(TableName.valueOf("bigdata2:student"),true);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值