package com.wzy.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 org.junit.Test;
import java.io.IOException;
public class HbaseTest {
private static final String ZK_CONNECT_KEY="hbase.zookeeper.quorum";
private static final String ZK_CONNECT_VALUE="172.10.0.11:2181,172.10.0.12:2181,172.10.0.21:2181,172.10.0.22:2181,172.10.0.23:2181";
private static Connection conn=null;
private static Admin admin=null;
/**
* 获得连接
* */
public static Connection getConn(){
//创建一个可以用来管理hbase配置信息的conf对象
Configuration conf=HBaseConfiguration.create();
//设置当前的程序去寻找hbase在哪里
conf.set(ZK_CONNECT_KEY,ZK_CONNECT_VALUE);
conf.set("zookeeper.znode.parent","/hbase");
//创建连接对象
try {
conn= ConnectionFactory.createConnection(conf);
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
/**
* 获得管理员对象
* */
public static Admin getAdmin(){
try {
admin=conn.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
return admin;
}
/**
* 通过表名和列簇创建表 (表必须包含表名称和列簇)
* */
public void createTable(String tableName,String[] family) throws IOException {
TableName tbName= TableName.valueOf(tableName);
//创建表前,先判断表是否存在
if(admin.tableExists(tbName)){
//表存在
System.out.println(tbName+"表已经存在");
}else{
//表不存在
//通过表名称创建列簇
HTableDescriptor htd=new HTableDescriptor(tbName);
//向列簇中添加列的信息
for(String str:family){
HColumnDescriptor hcd=new HColumnDescriptor(str);
//向表中填充列簇
htd.addFamily(hcd);
}
//创建表
admin.createTable(htd);
//判断表是否创建成功
if(admin.tableExists(tbName)){
System.out.println(tbName+"表创建成功");
}else{
System.out.println(tbName+"表创建失败");
}
}
}
/**
* 查询所有的表
* */
public void getAllTables() throws IOException {
//获取列簇的描述信息
HTableDescriptor[] htds=admin.listTables();
//遍历列簇描述信息
for(HTableDescriptor htd:htds){
//转化为名
String tbName=htd.getNameAsString();
//获取列的描述信息
HColumnDescriptor[] hcds=htd.getColumnFamilies();
System.out.println("表名称"+tbName);
//遍历列簇
for(HColumnDescriptor hcd:hcds){
//获取列簇的名字
String columnFamilyName=hcd.getNameAsString();
System.out.println("\t"+"列簇的名字:"+columnFamilyName);
}
}
}
/**
* 查询表的列簇属性
* */
public void descTable(String tableName) throws IOException {
//转化表名称
TableName tbName=TableName.valueOf(tableName);
//判断表是否存在
if(admin.tableExists(tbName)){
//表存在
//获取列簇的描述信息
HTableDescriptor htd=admin.getTableDescriptor(tbName);
//获取列簇中列的信息
HColumnDescriptor[] hcds=htd.getColumnFamilies();
//遍历列
for(HColumnDescriptor columnFamily:hcds){
System.out.println(columnFamily);
}
}else{
//表不存在
System.out.println(tbName+"表不存在");
}
}
/**
* 删除表,先disabled停用表
* */
public void disableTable(String tabName) throws IOException {
TableName tbName=TableName.valueOf(tabName);
//判断表是否存在
if(admin.tableExists(tbName)){
//存在,再判断表是否停用
if(admin.isTableEnabled(tbName)){
admin.disableTable(tbName); //停用表
}else{
System.out.println(tbName+"不是活动状态");
}
}else{
System.out.println(tbName+"表不存在");
}
}
/**
* 删除表
* */
public void dropTable(String tableName) throws IOException {
//转化表名称
TableName tbName=TableName.valueOf(tableName);
//判断表是否存在
if(admin.tableExists(tbName)){
//判断表是否停用
boolean tabStatus=admin.isTableEnabled(tbName);
if(tabStatus){
//使表变成不可用状态
admin.disableTable(tbName);
}
//删除表
admin.deleteTable(tbName);
//删除后,再次判断表是否存在
if(admin.tableExists(tbName)){
System.out.println("删除失败");
}else{
System.out.println("删除成功");
}
}else{
System.out.println(tbName+"表不存在");
}
}
/**
* 修改表,通过表名称
* */
public void updateTable(String tableName) throws IOException {
//转化为表名称
TableName tbName=TableName.valueOf(tableName);
//判断要修改的表是否存在
if(admin.tableExists(tbName)){
//表存在,判断表是否启用
//表的可用状态
boolean tabEnabled=admin.isTableEnabled(tbName);
if(tabEnabled){
//使表变为不可用
admin.disableTable(tbName);
}
//根据表名称得到表
HTableDescriptor htd=admin.getTableDescriptor(tbName);
//创建列簇结构对象,添加列
HColumnDescriptor columnFamily1=new HColumnDescriptor("cf1".getBytes());
HColumnDescriptor columnFamily2=new HColumnDescriptor("cf2".getBytes());
htd.addFamily(columnFamily1);
htd.addFamily(columnFamily2);
//修改列簇
admin.modifyTable(tbName,htd);
}else{
System.out.println(tbName+"表不存在");
}
}
/**
* 添加数据
* */
public void putData(String tableName,String rowKey,String familyName,String columnName,String value) throws IOException {
//转化为表名
TableName tbName=TableName.valueOf(tableName);
//添加数据之前,判断表是否存在,不存在的话就先创建表
if(admin.tableExists(tbName)){
}else{
//根据表名称创建表结构
HTableDescriptor htd=new HTableDescriptor(tbName);
//定义列簇的名字
HColumnDescriptor columnFamilyName=new HColumnDescriptor(familyName);
htd.addFamily(columnFamilyName);
admin.createTable(htd);
}
Table table=conn.getTable(tbName);
Put put=new Put(rowKey.getBytes());
put.addColumn(familyName.getBytes(),columnName.getBytes(),value.getBytes());
table.put(put);
}
/**
* sacn全表数据
* */
public ResultScanner getResultScan(String tableName) throws IOException {
ResultScanner result;
TableName tbName=TableName.valueOf(tableName);
//判断表是否存在
if(admin.tableExists(tbName)){
Table table=conn.getTable(tbName);
Scan scan=new Scan();
result=table.getScanner(scan);
for(Result rs:result){
for(KeyValue kv:rs.list()){
System.out.println(Bytes.toString(kv.getRow()));
System.out.println(Bytes.toString(kv.getFamily()));
System.out.println(Bytes.toString(kv.getQualifier()));
System.out.println(Bytes.toString(kv.getValue()));
System.out.println(kv.getTimestamp());
}
}
}else{
result=null;
}
System.out.println(result.toString());
return result;
}
/**
* 根据rowkey查询数据
* */
public Result getResult(String tableName,String rowKey) throws IOException {
Result result;
TableName tbName=TableName.valueOf(tableName);
if(admin.tableExists(tbName)){
Table table=conn.getTable(tbName);
Get get=new Get(rowKey.getBytes());
result=table.get(get);
}else{
result=null;
}
return result;
}
/**
* 删除数据
* */
public void deleteColumn(String tableName,String rowKey) throws IOException {
TableName tbName=TableName.valueOf(tableName);
if(admin.tableExists(tbName)){
Table table=conn.getTable(tbName);
Delete delete=new Delete(rowKey.getBytes());
table.delete(delete);
}else{
System.out.println(tbName+"表不存在");
}
}
@Test
public void test() throws IOException {
System.out.println("开始测试");
getConn();
getAdmin();
HbaseTest hdemo=new HbaseTest();
//创建表
//hdemo.createTable("student",new String[]{"base_info","address_info"});
//测试查询所有表
//hdemo.getAllTables();
//查询表的列簇属性
//hdemo.descTable("student");
//删除表
//hdemo.dropTable("student");
//修改tableName的所有列簇,将列簇修改为cf1和cf2
//hdemo.updateTable("student");
//向表中插入数据
//String tableName,String rowKey,String familyName,String columnName,String value
//hdemo.putData("student","rowKey01","cf1","username","张三");
//查询所有数据
hdemo.getResultScan("student");
}
}