3.2 API流程
HBase的API操作,第一步就要获取HBase配置变量:主要是通过加载Zookeeper集群,获取集群信息。
-- Configuration configuration = HBaseConfiguration.create();
-- return addHbaseResources(conf)
-- conf.addResource("hbase-default.xml"); //这个集成在jar包中了
-- conf.addResource("hbase-site.xml"); //其实主要是添加这个配置文件
//主要就是加载Zookeeper的集群信息。
//另一种方式是直接将hbase-site.xml这个文件放到工程的resource文件夹内
-- configuration.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");
第二步是获取连接对象,这类似于MySql中获取连接:
//HBase通过ConnectionFactory获取连接对象
-- Connection connection = ConnectionFactory.createConnection(configuration);
第三步是获取权限对象,也就是Admain管理员。
管理员可用于创建,删除,列出,启用和禁用以及以其他方式修改表以及执行其他管理操作。
Admin admin = connection.getAdmin();
最后一步:admin和connection作为资源需要关闭。
admin.close();
connection.close();
3.3 API 命名空间操作
①查看所有的命名空间
//TODO 1 查看所有的命名空间
NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();
for (NamespaceDescriptor namespaceDescriptor : namespaceDescriptors) {
System.out.println(namespaceDescriptor.getName());
}
②创建命名空间
创建命名空间,发现需要一个NamespaceDescriptor,可以发现NamespaceDescriptor私有构造器,所以使用静态的create.build方法创建命名空间的描述器。
//TODO 2 创建命名空间
NamespaceDescriptor descriptor = NamespaceDescriptor.create("TomNameSpace").build();
admin.createNamespace(descriptor);
System.out.println("命名空间创建成功");
③查看某个命名空间
//TODO 3 查看某个命名空间
System.out.println(admin.getNamespaceDescriptor("test"));
//其实可以查出NamespaceDescriptor就是描述命名空间的一些信息。
//{NAME => 'test'}
④删除某个命名空间
//TODO 4 删除某个命名空间
admin.deleteNamespace("codejiwei");
System.out.println("命名空间删除完毕");
3.4 API 表操作做
①创建表
创建表createTable需要传入一个TableDescriptor,使用TableDescriptorBuilder的builde方法创建一个TableDescriptorBuilder然后调用builde方法创建。
创建表需要给表添加列族信息!
addColumnFamily,需要传入一个familyDescriptor的参数。
//TODO 5 判断表是否存在
TableName tableName = TableName.valueOf("test:teacher");
boolean b = admin.tableExists(tableName);
if (b) {
//如果表存在
System.out.println(new String(tableName.getName()) + "已经存在");
}else {
//TODO 6 如果不存在,创建表
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
//创建表
admin.createTable(tableDescriptorBuilder.build());
ColumnFamilyDescriptorBuilder familyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info"));
//给表添加列族信息
admin.addColumnFamily(tableName, familyDescriptorBuilder.build());
System.out.println("表创建成功");
}
②删除表
删除表之前需要将表禁用掉disableTable,防止其他操作执行
如果删除表不存在,会发生错误:TableNotFoundException
所以删除前需要判断表是否存在
//TODO 7 删除表
//如果删除表不存在,会发生错误:TableNotFoundException
TableName tableName = TableName.valueOf("test:teacher");
boolean b = admin.tableExists(tableName);
if (b){
//如果表存在删除表
admin.disableTable(tableName);
admin.deleteTable(tableName);
System.out.println("表删除成功");
}else {
//如果表不存在,退出
System.out.println("表不存在");
}
③ 给表中添加数据
注意!!!获取表并不是使用admin获取,而是通过connection获取表connection.getTable()
添加数据时,需要创建Put对象,同时需要指定Rowkey
数据在HBase中是以字节数组的形式保存的,都需要使用Bytes.toBytes()转成字节数组
//TODO 7 给表中添加数据
TableName tableName = TableName.valueOf("test:teacher1");
//获取表
Table table = connection.getTable(tableName);
//put 'test:teacher1', '1001', 'info:name', 'Tom'
// 增加数据时,需要创建Put的对象,同时需要指定RowKey
Put put = new Put(Bytes.toBytes("1001"));
//添加数据列
put.addColumn(
Bytes.toBytes("info"),
Bytes.toBytes("name"),
Bytes.toBytes("zhangsan"));
//给表增加数据
table.put(put);
System.out.println("增加数据成功");
④ 查看表中单条记录
方式1:
//TODO 8 查询表中的数据
//获取表
TableName tableName = TableName.valueOf("test:teacher1");
Table table = connection.getTable(tableName);
//查询单条表数据
Get get = new Get(Bytes.toBytes("1001"));
//get 'test:teacher1', '1001', 'info:name'
Result result = table.get(get);
Cell[] cells = result.rawCells();
//通过CellUtil工具类的cloneFamily等方法获取
for (Cell cell : cells) {
System.out.println(Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println(Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println(Bytes.toString(CellUtil.cloneValue(cell)));
}
方式2:
⑤扫描全表数据
//TODO 8 扫描全表数据
//获取表
TableName tableName = TableName.valueOf("test:student");
Table table = connection.getTable(tableName);
//创建
ResultScanner scanner = table.getScanner(new Scan());
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()){
Result next = iterator.next();
Cell[] cells = next.rawCells();
for (Cell cell : cells) {
System.out.println(Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println(Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println(Bytes.toString(CellUtil.cloneValue(cell)));
}
}
⑥删除表中数据
//获取表
TableName tableName = TableName.valueOf("test:student");
Table table = connection.getTable(tableName);
//TODO 9 删除指定行键的所有数据
Delete delete = new Delete(Bytes.toBytes("1003"));
table.delete(delete);
System.out.println("删除成功");