zoukankan      html  css  js  c++  java
  • 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();
        }

  • 相关阅读:
    Springboot在IDEA中执行,开启热部署
    java 二分法学习
    python爬虫初级--获取指定页面上的菜单名称以及链接,然后导出
    使用POI读取xlsx文件,包含对excel中自定义时间格式的处理
    Linux CentOS6.8 项目部署脚本实现
    Springboot启动源码详解
    FreeMarker基础语法,宏,引用 等
    在eclipse中启动java程序的时候,每次都会在一个未设置断点的源码里面,卡断点
    Vue学习--
    阿里的maven镜像仓库,eclipse中使用maven下载jar包的时候提升速度
  • 原文地址:https://www.cnblogs.com/dazhi151/p/13832792.html
Copyright © 2011-2022 走看看