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(); }