HBase_API_(HBaseDDL,对表的api)
对hbase数据表进行以下操作:
1.创建命名空间
2.判断表是否存在
3.创建表格
4.修改表格
5.删除表格
注意:对表格的操作要调用admin,对数据进行操作调用table(这篇博客没有涉及到)
HBaseConnetion.java(提供connection连接)
package com.atguigu; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import java.io.IOException; /** * HBase多线程连接 */ public class HBaseConnection { //声明静态属性 public static Connection connection=null; static { // //1.创建配置对象 // Configuration configuration = new Configuration(); // // //2.设置配置参数 // configuration.set("hbase.zookeeper.quorum","node1,node2,node3"); //直接使用读取本地文件的形式添加参数 //3.建立hbase连接 try { connection = ConnectionFactory.createConnection(); } catch (IOException e) { // throw new RuntimeException(e); e.printStackTrace(); } } public static void closeConnection() throws IOException { //判断连接是否为空 if(connection!=null){ connection.close(); } } public static void main(String[] args) throws IOException { //不再main线程中单独创建连接,而是直接使用 System.out.println(HBaseConnection.connection); //用完记得关闭连接 HBaseConnection.closeConnection();; } }
package com.atguigu; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; /** * */ public class HBaseDDL { //声明静态属性 //引用的方式获取到同一个链接 public static Connection connection=HBaseConnection.connection; /** * 创建命名空间 * @param namespace 命名空间 */ public static void createNamespace(String namespace) throws IOException { //1.获取admin //admin连接是轻量级的,不是线程安全,不推荐池化或者缓存这个连接 //就是说用到的时候就去获取,用不到就关闭 Admin admin = connection.getAdmin(); //2.调用方法创建命名空间 //填写完整的命名空间描述 //2.1创建命名空间描述 NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace); //2.2给命名空间添加需求 builder.addConfiguration("user","xiaohuang"); //2.3使用builder构造出添加物参数的对象完成创建 //注意:创建命名空间所抛出的问题应该都属于该方法的本身问题,是不应该直接进行IOException抛出的 try { admin.createNamespace(builder.build()); } catch (IOException e) { System.out.println("命名空间已经存在"); // throw new RuntimeException(e); e.printStackTrace(); } //3.记得要关闭admin admin.close(); } /** * 判断表格是否存在 * @param namespace 命名空间名称 * @param tableName 表格名称 * @return ture 表示表格存在 */ public static boolean isTableExists(String namespace, String tableName) throws IOException { //1.获取admin Admin admin = connection.getAdmin(); //2.使用方法判断表格是否存在 boolean b = false; try { b = admin.tableExists(TableName.valueOf(namespace,tableName)); } catch (IOException e) { // throw new RuntimeException(e); e.printStackTrace(); } //3.关闭连接再返回!!!!!!!!!!!!!!!!! admin.close(); return b; } /** * 创建表格 * @param namespace 命名空间名称 * @param tableName 表格名称 * @param columnFamilies 列族 * String... 表示可变参数,用来接受不确定参数个数的。 */ public static void createTable(String namespace, String tableName, String... columnFamilies) throws IOException { //先判断一下是否至少有一个列族 //如果不加判断,因为是可变参数当参数为0的时候就会再try catch中才知道没有列族创建失败 if( columnFamilies.length == 0 ) { System.out.println("创建表格至少有一个列族"); return; } //判断表格是否存在 if(isTableExists(namespace,tableName)){ System.out.println("表格已存在"); return; } //1.获取admin Admin admin = connection.getAdmin(); //2.调用方法创建表格 //2.1创建表格描述 TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace,tableName));; //2.2添加参数 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) { // throw new RuntimeException(e); // System.out.println("表格已经存在"); e.printStackTrace(); } //关闭admin admin.close(); } /** * 修改表格 * @param namespace 命名空间 * @param tableName 表格名字 * @param columnFamily 列族名称 * @param version 版本 */ public static void modifyTable(String namespace, String tableName, String columnFamily, int version) throws IOException { //异常处理 //判断表格是否存在 if(!isTableExists(namespace,tableName)){ System.out.println("表格不存在,无法修改"); return; } //1.获取admin Admin admin = connection.getAdmin(); //2.调用方法修改表格 //2.1获取之前的表格描述 TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace,tableName)); //2.2创建描述者 TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor); //获取之前的列族描述 ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily)); //2.3数据修改 ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1); //2.4修改对应版本 columnFamilyDescriptorBuilder.setMaxVersions(version); tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build()); try { admin.modifyTable(tableDescriptorBuilder.build()); } catch (IOException e) { // throw new RuntimeException(e); e.printStackTrace(); } admin.close(); } /** * 删除表格 * @param namespace 命名空间名称 * @param tableName 表格名称 * @return true 表示删除成功 * 注意:hbase再删除表格的时候需要先警用表格 */ public static boolean deleteTable(String namespace, String tableName) throws IOException { //判断表格是否存在 if(!isTableExists(namespace,tableName)){ System.out.println("表格不存在,无法删除"); return false; } //进行删除表格 //1.获取admin Admin admin = connection.getAdmin(); //2.调用方法删除表格 try { //注意:要先禁用表格 admin.disableTable(TableName.valueOf(namespace,tableName)); admin.deleteTable(TableName.valueOf(namespace,tableName)); } catch (IOException e) { // throw new RuntimeException(e); e.printStackTrace(); } //3.关闭admin admin.close(); return true; } public static void main(String[] args) throws IOException { //1.测试创建命名空间 //要先确定连接是否出现问题,再执行相应的方法如createNamespace方法 // createNamespace("atguigu"); //2.判断表格是否存在 // System.out.println(isTableExists("default", "REQUEST")); //3.测试创建表格 // createTable("atguigu","student","msg"); //4.修改数据 // modifyTable("atguigu","student","msg",6); //5.删除表格 deleteTable("atguigu","student"); System.out.println("--------------"); //关闭hbase连接!!!!!!!!!!!! HBaseConnection.closeConnection(); } }