HBase_03_API操作

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("删除成功");

猜你喜欢

转载自blog.csdn.net/qq_43523503/article/details/113531442