需要注意的地方有3个:
①:要创建对象需要对表进行修改,就不能用admin了,需要用connection得到table对象对表进行操作
②:要插入数据需要put对象,而put对象需要的值都要是byte[]类型的,所以需要使用HBase提供的工具类Bytes进行类型转换
③:这里不统一关闭资源的原因是,每次操作的表对象可能不同,所以每次使用完都需要关闭资源
测试:
public static void main(String[] args) throws IOException { putData("stu2", "1001", "info1", "age", "19"); }结果:
插入成功
需要注意的地方有,这里table.get得到的是result对象,要通过for循环将需要显示的值打印出来,这里用到了CellUtil工具类
结果:
这里为了方便演示,我多插入了一些数据
hbase(main):011:0> put 'stu2','1001','info1:name','wangwu' 0 row(s) in 0.3650 seconds hbase(main):012:0> put 'stu2','1002','info1:name','lisi' 0 row(s) in 0.0050 seconds hbase(main):013:0> put 'stu2','1003','info1:age','20' 0 row(s) in 0.0060 seconds hbase(main):014:0> put 'stu2','1001','info2:gender','mail' 0 row(s) in 0.3940 seconds hbase(main):015:0> put 'stu2','1004','info2:gender','femail' 0 row(s) in 0.1180 seconds hbase(main):016:0> scan 'stu2' ROW COLUMN+CELL 1001 column=info1:age, timestamp=1603271533575, value=19 1001 column=info1:name, timestamp=1603272173139, value=wangwu 1001 column=info2:gender, timestamp=1603272222751, value=mail 1002 column=info1:name, timestamp=1603272186813, value=lisi 1003 column=info1:age, timestamp=1603272200613, value=20 1004 column=info2:gender, timestamp=1603272235793, value=femail①扫描全表:
public static void scanData(String tableName, String startRow, String stopRow) throws IOException { //1、创建表对象 Table table = connection.getTable(TableName.valueOf(tableName)); //2、创建scan对象 //2.1、扫描全表 Scan scan = new Scan(); //2.2、扫描范围内的列(左闭右开) // Scan scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow)); //3、扫描表 ResultScanner resultScanner = table.getScanner(scan); //4、解析resultScanner并打印 for (Result result : resultScanner){ //5、解析result for (Cell cell : result.rawCells()){ //6、打印数据 System.out.println("RK:" + Bytes.toString(CellUtil.cloneRow(cell)) + ",CF:" + Bytes.toString(CellUtil.cloneFamily(cell)) + ",CN:" + Bytes.toString(CellUtil.cloneQualifier(cell)) + ",Value:" + Bytes.toString(CellUtil.cloneValue(cell))); } } //7、关闭资源 table.close(); } public static void main(String[] args) throws IOException { scanData("stu2", "1001", "1003"); }结果:
②扫描部分列:
Scan scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow));结果:
delete分为3个部分,一是删除指定元素,三是删除指定列族
插入了两个版本的数据:
hbase(main):018:0> put 'stu2','1001','info1:age','17' 0 row(s) in 0.0130 seconds hbase(main):019:0> put 'stu2','1001','info1:name','xiaobai' 0 row(s) in 0.1160 seconds hbase(main):020:0> scan 'stu2',{RAW=>true,VERSIONS=>10} ROW COLUMN+CELL 1001 column=info1:age, timestamp=1603273541687, value=17 1001 column=info1:age, timestamp=1603271533575, value=19 1001 column=info1:name, timestamp=1603273571343, value=xiaobai 1001 column=info1:name, timestamp=1603272173139, value=wangwu 1001 column=info2:gender, timestamp=1603272222751, value=mail 1002 column=info1:name, timestamp=1603272186813, value=lisi 1003 column=info1:age, timestamp=1603272200613, value=20 1004 column=info2:gender, timestamp=1603272235793, value=femail 4 row(s) in 0.0200 seconds结果:
我们发现,只是删除了这个值,那么如何删除这个值的所有版本呢?
我们看看addColumns会如何:
delete.addColumns(Bytes.toBytes(cf), Bytes.toBytes(cn)); public static void main(String[] args) throws IOException { deleteData("stu2", "1001", "info1", "name", 1561453); }结果:
我们发现1001这个rowkey的info1的name这一列已经被打上删除标签了
最后:
delete.addFamily(Bytes.toBytes(cf));结果:
给info1列族加了一个DeleteFamily标签