前几篇文章我们介绍了HBase的原理以及安装部署、命令行操作等知识,本文我们来看一下HBase的API操作。关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~
目录
一、环境准备
首先需要新建工程并导入相关的依赖,如下所示:
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
二、HBase API操作
2.1 获取HBase连接对象
首先需要把hbase-site.xml配置文件拷贝到resources目录下:
通过以下代码获取连接对象:
//1、创建配置对象,获取HBase连接
Configuration conf = HBaseConfiguration.create();
//2、获取HBase连接对象
Connection conn = ConnectionFactory.createConnection(conf);
System.out.println(conn);
我们可以通过控制台打印一下,结果如下:
出现了上面的结果,说明连接成功。
2.2 判断命名空间是否存在
通过以下方式判断HBase中是否存在某个命名空间,如果不存在则创建命名空间:
/**
* 判断HBase中是否存在命名空间
*
* @param namespace 命名空间的名称
* @param admin 操作对象
* @throws IOException
*/
public static void isNamespaceExist(String namespace, Admin admin) throws IOException {
try {
//判断表空间是否存在,不存在会抛出异常
admin.getNamespaceDescriptor(namespace);
} catch (NamespaceNotFoundException e) {
//创建表空间
NamespaceDescriptor nd = NamespaceDescriptor.create(namespace).build();
admin.createNamespace(nd);
}
}
完整代码会在文章最后给出!!!
通过命令行,我们可以发现已经成功创建了命名空间:
2.3 判断HBase中是否存在某张表
通过一下方法判断HBase中是否存在某张表,返回布尔类型的结果:
/**
* 判断HBase中是否存在某张表
*
* @param tableName 表名
* @param admin 操作对象
* @return 返回true or false
* @throws IOException
*/
public static boolean isTableExist(String tableName, Admin admin) throws IOException {
TableName tn = TableName.valueOf(tableName);
boolean b = admin.tableExists(tn);
return b;
}
在控制台输出如下结果:
因为这里我们已经创建了该表,所以会返回true。
2.4 创建表
如果不存在某张表,可以使用如下方法创建表:
/**
* 创建HBase表
*
* @param tableName 表名
* @param admin 操作对象
* @param columnFamily 列族
* @throws IOException
*/
public static void createTable(String tableName, Admin admin, String... columnFamily) throws IOException {
//判断表是否存在
boolean b = isTableExist(tableName, admin);
if (b) {
System.out.println(tableName + "已经存在!");
} else {
//创建表描述对象
HTableDescriptor td = new HTableDescriptor(tableName);
//增加列族
for (String cf : columnFamily) {
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
td.addFamily(hColumnDescriptor);
}
admin.createTable(td);
System.out.println(tableName + "表创建成功!");
}
}
2.5 操作表
可以通过以下方法向HBase中插入数据或者从HBase中查询数据:
/**
* 操作表
*
* @param connection 连接对象
* @param tableName 表名
* @throws IOException
*/
public static void execTable(Connection connection, String tableName) throws IOException {
TableName tn = TableName.valueOf(tableName);
Table table = connection.getTable(tn);
//查询数据
String rowkey = "1001";
Get get = new Get(Bytes.toBytes(rowkey));
Result result = table.get(get);
boolean empty = result.isEmpty();
System.out.println(tableName + "表中是否存在该条数据:" + !empty);
if (empty) {
//插入数据
Put put = new Put(Bytes.toBytes(rowkey));
String family = "info";
String column = "name";
String value = "fq";
put.addColumn(Bytes.toBytes(family), Bytes.toBytes(column), Bytes.toBytes(value));
table.put(put);
System.out.println("插入数据成功!");
} else {
//展示数据
for (Cell cell :
result.rawCells()) {
System.out.println("family = " + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("rowkey = " + Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("value = " + Bytes.toString(CellUtil.cloneValue(cell)));
System.out.println("column = " + Bytes.toString(CellUtil.cloneQualifier(cell)));
}
}
}
当表中没有数据的时候会执行插入操作,结果如下所示:
当表中有数据的时候会读取数据,如下所示:
2.6 删除表
通过以下方法删除HBase中的某张表:
/**
* 删除表
*
* @param tableName 表名
* @param admin 操作对象
* @throws IOException
*/
public static void delTable(String tableName, Admin admin) throws IOException {
TableName tn = TableName.valueOf(tableName);
if (admin.tableExists(tn)) {
//禁用表
admin.disableTable(tn);
//删除表
admin.deleteTable(tn);
}
}
2.7 删除表数据
通过以下方法删除对应表中的数据:
/**
* 删除表数据
*
* @param tableName 表名
* @param connection 连接对象
* @throws IOException
*/
public static void delData(String tableName, Connection connection) throws IOException {
TableName tn = TableName.valueOf(tableName);
Table table = connection.getTable(tn);
String rowkey = "1001";
Delete delete = new Delete(Bytes.toBytes(rowkey));
table.delete(delete);
}
三、完整代码
package com.xzw.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* @author: xzw
* @create_date: 2021/3/15 9:34
* @desc: 测试HBase API
* @modifier:
* @modified_date:
* @desc:
*/
public class HBaseAPI {
/**
* 判断HBase中是否存在命名空间
*
* @param namespace 命名空间的名称
* @param admin 操作对象
* @throws IOException
*/
public static void isNamespaceExist(String namespace, Admin admin) throws IOException {
try {
//判断表空间是否存在,不存在会抛出异常
admin.getNamespaceDescriptor(namespace);
} catch (NamespaceNotFoundException e) {
//创建表空间
NamespaceDescriptor nd = NamespaceDescriptor.create(namespace).build();
admin.createNamespace(nd);
}
}
/**
* 判断HBase中是否存在某张表
*
* @param tableName 表名
* @param admin 操作对象
* @return 返回true or false
* @throws IOException
*/
public static boolean isTableExist(String tableName, Admin admin) throws IOException {
TableName tn = TableName.valueOf(tableName);
boolean b = admin.tableExists(tn);
return b;
}
/**
* 创建HBase表
*
* @param tableName 表名
* @param admin 操作对象
* @param columnFamily 列族
* @throws IOException
*/
public static void createTable(String tableName, Admin admin, String... columnFamily) throws IOException {
//判断表是否存在
boolean b = isTableExist(tableName, admin);
if (b) {
System.out.println(tableName + "已经存在!");
} else {
//创建表描述对象
HTableDescriptor td = new HTableDescriptor(tableName);
//增加列族
for (String cf : columnFamily) {
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
td.addFamily(hColumnDescriptor);
}
admin.createTable(td);
System.out.println(tableName + "表创建成功!");
}
}
/**
* 操作表
*
* @param connection 连接对象
* @param tableName 表名
* @throws IOException
*/
public static void execTable(Connection connection, String tableName) throws IOException {
TableName tn = TableName.valueOf(tableName);
Table table = connection.getTable(tn);
//查询数据
String rowkey = "1001";
Get get = new Get(Bytes.toBytes(rowkey));
Result result = table.get(get);
boolean empty = result.isEmpty();
System.out.println(tableName + "表中是否存在该条数据:" + !empty);
if (empty) {
//插入数据
Put put = new Put(Bytes.toBytes(rowkey));
String family = "info";
String column = "name";
String value = "fq";
put.addColumn(Bytes.toBytes(family), Bytes.toBytes(column), Bytes.toBytes(value));
table.put(put);
System.out.println("插入数据成功!");
} else {
//展示数据
for (Cell cell :
result.rawCells()) {
System.out.println("family = " + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("rowkey = " + Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("value = " + Bytes.toString(CellUtil.cloneValue(cell)));
System.out.println("column = " + Bytes.toString(CellUtil.cloneQualifier(cell)));
}
}
}
/**
* 删除表
*
* @param tableName 表名
* @param admin 操作对象
* @throws IOException
*/
public static void delTable(String tableName, Admin admin) throws IOException {
TableName tn = TableName.valueOf(tableName);
if (admin.tableExists(tn)) {
//禁用表
admin.disableTable(tn);
//删除表
admin.deleteTable(tn);
}
}
/**
* 删除表数据
*
* @param tableName 表名
* @param connection 连接对象
* @throws IOException
*/
public static void delData(String tableName, Connection connection) throws IOException {
TableName tn = TableName.valueOf(tableName);
Table table = connection.getTable(tn);
String rowkey = "1001";
Delete delete = new Delete(Bytes.toBytes(rowkey));
table.delete(delete);
}
public static void main(String[] args) throws IOException {
//1、创建配置对象,获取HBase连接
Configuration conf = HBaseConfiguration.create();
//2、获取HBase连接对象
Connection conn = ConnectionFactory.createConnection(conf);
// System.out.println(conn);
//3、获取操作对象
Admin admin = conn.getAdmin();
//4、操作数据库
//4.0 定义一些变量
String namespace = "xzw";
String tableName = "people";
String columnFamily1 = "info";
//4.1 判断命名空间是否存在,不存在的话创建命名空间
isNamespaceExist(namespace, admin);
//4.2 判断HBase中是否存在某张表
boolean b = isTableExist(namespace + ":" + tableName, admin);
System.out.println("HBase中是否存在" + namespace + ":" + tableName + "表:" + b);
//4.3 创建表
createTable(namespace + ":" + tableName, admin, columnFamily1);
//4.4 操作表
execTable(conn, namespace + ":" + tableName);
//4.5 删除表
delTable(namespace + ":" + tableName, admin);
//4.6 删除表数据
delData(namespace + ":" + tableName, conn);
}
}
以上就是本文的所有内容,比较简单。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题~