Hbase学习02-API操作

重要的部分

1.创建hbase连接以及admin管理对象

要操作hbase也需要建立hbase的连接,此处我们仍然使用TestNG来进行测试,使用@BeforeTest初始化Hbase的连接,然后创建admin的对象,@AfterTest来关闭连接

实现步骤:“
1.1使用HbaseConfiguration.create()创建Hbase配置~
1.2使用ConnectionFactory.createConnection()创建Hbase连接
1.3要创建表,需要基于Hbase连接获取admin管理对象
1.4使用admin.close.connection.close关闭连接

其中重要的before和after操作:

 //开始前都要执行的
    @BeforeTest
    public void beforeTest() throws IOException {
        //1使用HbaseConfiguration.create()创建Hbase配置~
        Configuration configuration = HBaseConfiguration.create();
        //2使用ConnectionFactory.createConnection()创建Hbase连接
        connection = ConnectionFactory.createConnection(configuration);
        //3要创建表,需要基于Hbase连接获取admin管理对象
        //要创建表和删除表都需要hmaster创建连接就需要一个admin对象
        admin = connection.getAdmin();


    }
    //结束之前都要执行的
    @AfterTest
    public void afterTest() throws IOException {
        //4使用admin.close.connection.close关闭连接
        admin.close();
        connection.close();

    }

2、进行创建表的操作

 @Test
    public void createTable() throws IOException {
        TableName tableName = TableName.valueOf("WATER_BILL");
        //1、判断这个表是否存在
        if (admin.tableExists(tableName)){
            System.out.println("表存在");
            return;
        }
        //构建表
        //2、使用TableDescriptorBuilder.newBuilder构建表描述构造器
        //TableDescriptorBuilder:表描述器他是用来描述这个表有几个列蔟和其他属性
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
        //3、使用ColumnFamilyDescriptorBuilder.newBuilder()构建列蔟描述构造器
        //创建列蔟也需要有列蔟的描述器,需要用一个构建器来构建ColumnFamilyDescriptor
        //经常会使用到一个工具类:Bytes (hbase包下的Bytes工具类)
        //这个工具类可以将字符串、long.double类型转换成byte[]数组
        //也可以将byte[]数组转换为指定类型
        ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("C1"));
        //4、构建列蔟描述,构建表描述
        ColumnFamilyDescriptor cfDes = columnFamilyDescriptorBuilder.build();
        //建立表和列蔟的关联
        tableDescriptorBuilder.setColumnFamily(cfDes);
        TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
        //5、创建表
        admin.createTable(tableDescriptor);
    }

3、写入数据操作:

  //写入数据
    @Test
    public void putTest() throws IOException {
        //1使用hbase连接获取htable
        Table table = connection.getTable(TABLE_NAME);
        //2都贱ROWKEY、列蔟、列名
        String rowkey="4944191";
        String columnFamily="C1";
        String columnName="NAME";
        String columnNameADDRESS ="ADDRESS ";
        String columnNameSEX="SEX";
        String columnNamePAR_DATE="PAR_DATE";
        String columnNameNUM_CURRENT="NUM_CURRENT";
        String columnNameNUM_PERVIOUS="NUM_PERVIOUS";
        String columnNameNUM_USAGE="NUM_USAGE";
        String columnNameTOTAL_MONEY="TOTAL_MONEY";
        String columnNameRECORD_DATE ="RECORD_DATE ";
        String columnNameLATEST_DATE="LATEST_DATE";

        //value为温学智
        //3构造put对象(对应put命令)
        Put put = new Put(Bytes.toBytes(rowkey));
        //4添加性名列
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName),Bytes.toBytes("温学智"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameADDRESS "),Bytes.toBytes("河北省"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameSEX"),Bytes.toBytes(""));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNamePAR_DATE"),Bytes.toBytes("2020-05-19"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameNUM_CURRENT"),Bytes.toBytes("308.1"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameNUM_PERVIOUS"),Bytes.toBytes("308.1"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameNUM_USAGE"),Bytes.toBytes("25"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameTOTAL_MONEY"),Bytes.toBytes("150"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameRECORD_DATE "),Bytes.toBytes("2020-04-25"));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes("columnNameLATEST_DATE"),Bytes.toBytes("2020-06-09"));
            //5、使用htable表对象执行put操作
        table.put(put);
        //6、关闭table表对象
        //htable是一个轻量级的对象可以经常创建
        //htable他是一个非线程安全的
        table.close();

    

 

 

 

 4、通过rowkey获取数据:

  //获取数据/*获取rowkey为4944191的所有的列的信息*/
    @Test
    public void getTest() throws IOException {
        //实现步骤:
        //1获取HTablew
        Table table = connection.getTable(TABLE_NAME);

        //2使用rowkey构建Get对象-
        Get get = new Get(Bytes.toBytes("4944191"));

        //3执行get请求-
        Result result = table.get(get);

        //4.获取所有单元格
        List<Cell> cellList = result.listCells();

        //5打印rowkey-
        byte[] rowkey = result.getRow();
        System.out.println(Bytes.toString(rowkey));

        //6.迭代单元格列表-
        for (Cell cell : cellList) {
            //将字节数组转换换位字符串
            //获取列蔟的名称
            String cf=Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(),cell.getFamilyLength());

            //获取列的名称
            String columnName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
            //获取数值
            String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
            System.out.println(cf+" : "+columnName+" -> "+value);
        }
        //7.关闭表~
        table.close();
    }

 

5、根据rowkey进行数据的删除

  //删除数据
    @Test
    public void deleteTest() throws IOException {
        //1.获取HTable对象-
        Table table = connection.getTable(TABLE_NAME);
        //2.根据rowkey构建delete对象-

        Delete delete = new Delete(Bytes.toBytes("4944191"));
        //3.执行delete请求-
        table.delete(delete);

        //4.关闭表
        table.close();
    }

6、给定一个日期区间。查找这个区间的所有数据并输出;

//查看日期下的信息给定一个日期区间
    @Test
    public void scanFilterTest() throws IOException {
//        l....获取表
        Table table = connection.getTable(TABLE_NAME);
//        2...构建scan请求对象
        Scan scan = new Scan();
//        3..构建两个过滤器
//        a)构建两个日期范围过滤器_注意此处请使用RECORD_DATE...抄表日期比较..
        SingleColumnValueExcludeFilter startFilter = new SingleColumnValueExcludeFilter(Bytes.toBytes("C1"), Bytes.toBytes("RECORD_DATE"), CompareOperator.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("2020-06-01")));
        SingleColumnValueExcludeFilter endFilter = new SingleColumnValueExcludeFilter(Bytes.toBytes("C1"), Bytes.toBytes("RECORD_DATE"), CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("2020-06-30")));

//        b)构建过滤器列表
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, startFilter, endFilter);
//        4......执行scan扫描请求.
        scan.setFilter(filterList);
        ResultScanner resultScanner = table.getScanner(scan);
        Iterator<Result> iterator = resultScanner.iterator();
        while(iterator.hasNext())
        {
            //列出所有节点的单元格
            //5..迭代打印result..
            Result result = iterator.next();
            List<Cell> cellList = result.listCells();
            //打印rowkey
            byte[] rowkey = result.getRow();
            System.out.println(Bytes.toString(rowkey));
            //        6...迭代单元格列表
            for(Cell cell:cellList)
            {
                //将字节数组转换为字符串
                //获取列蔟的名称
                String cf = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
                //获取列的名称
                String columnName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());

                //获取数值
                String value = "";

                ////解决乱码问题:
                //l/思路:
                ////如果某个列是以下列中的其中一个,调用toDouble将它认为是一个数值来转换
                ////1. NUM_CURRENT
                ////2.NUM_PREVIOUs
                ////3.NUM_USAGE
                ////4.TOTAL_MONEY

                if(columnName.equals("NUM_CURRENT")|| columnName.equals( "NUM_PREVIOUS")|| columnName.equals("NUM_USAGE" )|| columnName.equals("TOTAL_MONEY"))
                {
                    value = Bytes.toDouble(cell. getValueArray())+"";
                }
                else
                 {
                         //获取值
                    value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength())
                 }
                System.out.println(cf+" : "+columnName+" -> "+value);

            }

        }
//        7...关闭Resultscanner《这玩意把转换成一个个的类似get的操作注意要关闭释放资源2
        resultScanner.close();
//        8..关闭表.
        table.close();
    }

 

posted @ 2020-10-19 19:31  喜欢爬的孩子  阅读(334)  评论(0编辑  收藏  举报