9月13日学习内容
昨天学习了shell命令
今天学习了Hbase的API增删改查:
package com.atguigu;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class HBaseDDL {
public static Connection connection=HBaseConnection.connection;
//创建命名空间
public static void createNamespace(String namespace) throws IOException {
//获取admin
//admin的连接是轻量级的,不是线程安全的,不推荐池化或缓存这个连接
Admin admin=connection.getAdmin();
//调用方法创建命名空间
//代码相对shell更加底层,所以shell能够实现的功能代码一定能实现
// 所以需要填写完整的命名空间描述
//创建命名空间描述建造者=》设计师
NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);
//给命名空间添加需求
builder.addConfiguration("user","atguigu");
//使用builder构造出对应的添加完参数的对象 完成构建
//创建命名空间出现的问题属于本方法自身的问题 不应该抛出
try {
admin.createNamespace(builder.build());
} catch (IOException e) {
System.out.println("命名空间已经存在");
e.printStackTrace();
}
//关闭admin
admin.close();
}
//判断表格是否存在
public static boolean isTableExist(String namespace,String tableName) throws IOException {
//获取admin
Admin admin=connection.getAdmin();
//使用方法判断表格是否存在
boolean b= false;
try {
b = admin.tableExists(TableName.valueOf(namespace, tableName));
} catch (IOException e) {
e.printStackTrace();
}
//关闭连接
admin.close();
return b;
}
//创建表格(namespqce命名空间名称,tableName表格名称,columnFamilies列族名称)
public static void createTable(String namespace,String tableName,String... columnFamilies) throws IOException {
//判断是否至少有一个列族
if(columnFamilies.length==0){
System.out.println("创建表格至少有一个列族");
return;
}
//判断表格是否已经存在
if(isTableExist(namespace, tableName)){
System.out.println("表格已经存在");
return;
}
//获取admin
Admin admin=connection.getAdmin();
//调用方法创建表格
//创建表格描述的建造者
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
//添加参数
for (String columnFamily : columnFamilies) {
//创建列族描述的建造者
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
//对应当前的列族添加数据
//添加版本参数
columnFamilyDescriptorBuilder.setMaxVersions(5);
//创建添加完参数的列族描述
tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
}
//创建对应的表格描述
try {
admin.createTable(tableDescriptorBuilder.build());
} catch (IOException e) {
e.printStackTrace();
}
//关闭admin
admin.close();
}
//添加数据
public static void putCell(String namespace,String tableName,String rowKey,String columnFamily,String columnName,String value) throws IOException {
//获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//调用相关方法插入数据
//创建put对象
Put put = new Put(Bytes.toBytes(rowKey));
//给Put对象添加数据
put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName),Bytes.toBytes(value));
//将对象写入相应的方法
try {
table.put(put);
} catch (IOException e) {
e.printStackTrace();
}
//关闭table
table.close();
}
//获取数据
public static void getCells(String namespace,String tableName,String rowKey,String columnFamily,String columnName) throws IOException {
//获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//获取get对象
Get get = new Get(Bytes.toBytes(rowKey));
//如果直接调用get方法直接获取一整行数据
//如果想读取某一时刻的数据,需要添加相应的参数
get.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));
//设置读取数据的版本
get.readAllVersions();
//读取数据,获得result对象
Result result=table.get(get);
Cell[] cells=result.rawCells();
table.close();
}
//扫描数据
public static void scanRows(String namespace,String tableName,String startRow,String stopRow) throws IOException {
//获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//获取scan对象
Scan scan = new Scan();
//如果此时直接调用会直接扫描整个表
//可以添加参数来控制扫描
//默认包含
scan.withStartRow(Bytes.toBytes(startRow));
//默认不包含
scan.withStopRow(Bytes.toBytes(stopRow));
//读取多行数据,获取scanner
ResultScanner scanner = null;
try {
scanner = table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
//result记录的相应的行数据, cell数据
//ResultScanner记录多行数据result数据
for(Result result:scanner){
Cell[] cells= result.rawCells();
for(Cell cell:cells){
System.out.println(new String(CellUtil.cloneRow(cell))+"-"+new String(CellUtil.cloneFamily(cell))+"-"+new String(CellUtil.cloneQualifier(cell))+"-"+new String(CellUtil.cloneValue(cell)));
}
System.out.println();
}
table.close();
}
//单行过滤扫描
public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String columnFamily,String columnName,String value) throws IOException {
//获取table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));
//获取scan对象
Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes(startRow));
//默认不包含
scan.withStopRow(Bytes.toBytes(stopRow));
//可以添加多个过滤
FilterList filterList = new FilterList();
//创建过滤器
scan.setFilter(filterList);
//结果只保留当前列的数据
ColumnValueFilter columnValueFilter=new ColumnValueFilter(
Bytes.toBytes(columnFamily),
Bytes.toBytes(columnName),
CompareOperator.EQUAL,
Bytes.toBytes(value)
);
filterList.addFilter(columnValueFilter);
//添加过滤
scan.setFilter(filterList);
ResultScanner scanner = null;
try {
scanner = table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
for(Result result:scanner){
Cell[] cells= result.rawCells();
for(Cell cell:cells){
System.out.println(new String(CellUtil.cloneRow(cell))+"-"+new String(CellUtil.cloneFamily(cell))+"-"+new String(CellUtil.cloneQualifier(cell))+"-"+new String(CellUtil.cloneValue(cell))+"\t");
}
System.out.println();
}
table.close();
}
//修改表格
public static void modifyTable(String namespace,String tableName,String columnFamily,int version) throws IOException {
//判断表格是否存在
if(!isTableExist(namespace,tableName)){
return;
}
//获取admin
Admin admin=connection.getAdmin();
try{
//调用方法修改表格
//创建表格描述建造者
//如果使用填写tableName的方法相当于创建一个新的表格描述建造者,没有之前的信息
//如果想要修改之前的信息,必须调用方法填写一个旧的表格描述
//获取之前的表格描述
TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);
//对应建造者进行表格数据的修改
ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
//创建列族描述建造者
//需要填写旧的列族描述
ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);
//修改对应的版本
columnFamilyDescriptorBuilder.setMaxVersions(version);
//此处修改的时候,如果是新创建的,那么别的参数会初始化
tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
try {
admin.modifyTable(tableDescriptorBuilder.build());
} catch (IOException e) {
e.printStackTrace();
}
}catch(IOException e){
System.out.println("表格不存在");
e.printStackTrace();
}
//关闭admin
admin.close();
}
//删除表格
public static boolean deleteTable(String namespace,String tableName) throws IOException {
//判断表格是否存在
if(!isTableExist(namespace,tableName)){
System.out.println("表格不存在,无法删除");
return false;
}
//删除表格
Admin admin=connection.getAdmin();
//调用相关的方法删除表格
try {
//HBase删除表格之前 一定要标记表格为不可用
admin.disableTable(TableName.valueOf(namespace, tableName));
admin.deleteTable(TableName.valueOf(namespace, tableName));
} catch (IOException e) {
e.printStackTrace();
}
//关闭admin
admin.close();
return true;
}
public static void main(String[] args) throws IOException {
//测试创建命名空间
createNamespace("atguigu");
//测试判断表格是否存在
System.out.println(isTableExist("atguigu","list"));
//测试创建表格
createTable("atguigu","student","info","msg");
//测试修改表格
modifyTable("atguigu","student","info",6);
//删除表格
deleteTable("atguigu","student");
//其他代码
System.out.println("其他代码");
//关闭hbase连接
HBaseConnection.closeConnection();
}
}