package com.chris.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;
public class hbaseAPI {
private static Admin admin = null;
private static Connection connection= null;
// 当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化
static {
try {
// 1.获取配置信息
Configuration conf = HbaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","hadoop102,hadoop103,hadoop104");
// 2.创建连接对象
connection = ConnectionFactory.createConnection(conf);
// 3.创建Admin对象
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭资源
public static void close(){
if(admin!=null){
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 判断表是否存在
public static boolean isTableExist(String tableName) throws IOException {
boolean ans = admin.tableExists(TableName.valueOf(tableName));
return ans;
}
// 创建表
public static void createTable(String tableName,String... columnFamilies) throws IOException {
// 1.判断是否存在列族信息
if(columnFamilies.length<=0){
System.out.println("请设置列族信息!");
return;
}
// 2.判断表是否存在
if(isTableExist(tableName)){
System.out.println(tableName+"表已存在!");
}
// 3.创建表描述器
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
// 4.循环添加列族信息
for (String cfs : columnFamilies) {
// 5.创建列族描述器
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cfs);
// 6.添加具体的列族信息
hTableDescriptor.addFamily(hColumnDescriptor);
}
// 7.创建表
admin.createTable(hTableDescriptor);
}
// 创建命名空间
public static void createNameSpace(String name){
NamespaceDescriptor descriptor = NamespaceDescriptor.create(name).build();
try {
admin.createNamespace(descriptor);
System.out.println("----"+name+"命名空间创建成功!");
} catch (NamespaceExistException e){
System.out.println("该命名空间已存在!");
}
catch (IOException e) {
e.printStackTrace();
}
}
// 删除表
public static void deleteTable(String tableName) throws IOException {
// 1.判断表是否存在
if(!isTableExist(tableName)){
System.out.println(tableName+"--该表不存在!");
}
TableName name = TableName.valueOf(tableName);
// 2. 先disable表
admin.disableTable(name);
// 3.再删除表
admin.deleteTable(name);
System.out.println("----该表删除成功!");
}
// 插入数据
// cf : 列族 cn:列
public static void putData(String tableName,String rowKey,String cf,String cn,String value) throws IOException {
// 1.获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
// 2.创建put对象
Put put = new Put(Bytes.toBytes(rowKey));
// 3.添加 列族、列、值 (批量添加数据:1、批量添加列 2、批量添加rowKey)
put.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cn),Bytes.toBytes(value));
// 4.插入数据
table.put(put);
System.out.println("-----数据插入成功!");
// 关闭资源
table.close();
}
// 获取数据 (get)
public static void getData(String tableName, String rowKey, String cf, String cn) throws IOException {
// 1.获取表对象
Table table = connection.getTable(TableName.valueOf(tableName));
// 2.创建get对象
Get get = new Get(Bytes.toBytes(rowKey));
// 2.1 指定获取的列族
// get.addFamily(Bytes.toBytes(cf));
// 2.2 指定列族和列
get.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cn));
// 2.3 设置获取的版本数
get.setMaxVersions(2);
// 3.获取数据
Result result = table.get(get);
for (Cell cell : result.rawCells()) {
// 4.打印数据
System.out.println("CF:"+Bytes.toString(CellUtil.cloneFamily(cell))+
",CN:"+Bytes.toString(CellUtil.cloneQualifier(cell))+
",Value:"+Bytes.toString(CellUtil.clonevalue(cell)));
}
// 5.关闭表连接
table.close();
}
// 获取数据 (scan)
public static void scan(String tableName) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan(Bytes.toBytes("1001"),Bytes.toBytes("1002"));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
for (Cell cell : result.rawCells()) {
// 4.打印数据
System.out.println("RowKey:"+Bytes.toString(CellUtil.cloneRow(cell))+
",CF:"+Bytes.toString(CellUtil.cloneFamily(cell))+
",CN:"+Bytes.toString(CellUtil.cloneQualifier(cell))+
",Value:"+Bytes.toString(CellUtil.clonevalue(cell)));
}
}
table.close();
}
// 删除数据(delete)
public static void deleteData(String tableName,String rowKey,String cf,String cn) throws IOException {
// 1.创建表对象
Table table = connection.getTable(TableName.valueOf(tableName));
// 2.创建delete对象
Delete delete = new Delete(Bytes.toBytes(rowKey));
// 2.1 指定删除的列 (type=DeleteColumn ,删除所有版本)
// delete.addColumns(Bytes.toBytes(cf),Bytes.toBytes(cn));
// 2.2 指定删除的列 (type=Delete ,删除当前版本,再次查询会发现历史版本)
delete.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cn));
// 3.执行删除操作 (只提供tableName和rowKey,会删除整个列族,type=DeleteFamily )
table.delete(delete);
System.out.println("----删除成功!");
// 4.关闭连接
table.close();
}
public static void main(String[] args) throws IOException {
// 1.判断表是否存在
boolean exist = isTableExist("stu");
System.out.println("stu是否存在?"+exist);
// 2.创建表
System.out.println(isTableExist("stu2"));
createTable("stu2","info");
System.out.println(isTableExist("stu2"));
// 3.删除表
deleteTable("stu1");
// 4.创建命名空间
createNameSpace("2022");
// 5.向表中插入数据
putData("stu","1001","info","name","Booker");
putData("stu","1002","info","name","Ayton");
// 6.获得表数据 (get)
getData("stu","1004","info", "name");
// 7.获取表数据 (scan)
scan("stu");
// 8.删除数据
deleteData("stu1","1001","info1","name");
close();
}
}