• HBase API 的用法总结


    一、获得connection

    因为connection为重量级框架,而admin 和table 为轻量级框架,所以在进行操作前,需要先初始化一个connection

    public class ConnectionUtil {
    
        //可以获取Connection对象的方法
        public  static Connection getConn() throws IOException {
    
            return ConnectionFactory.createConnection();
    
        }
    
        //关闭connection对象的方法
        public static void  close(Connection conn) throws IOException {
    
            if (conn !=null){
    
                conn.close();
    
            }
    
        }
    
    
    }

    二、针对NameSpace 的API

    import org.apache.commons.lang.StringUtils;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.NamespaceDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.Connection;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by VULCAN on 2020/3/20
     */
    public class NameSpaceUtil {
    
        private  static Logger logger= LoggerFactory.getLogger(NameSpaceUtil.class);
    
        //list_namespace 查询所有库
        public  static List<String> listNameSpaces(Connection conn) throws IOException {
    
            ArrayList<String> nameSpaces = new ArrayList<>();
    
            //获取一个Admin对象
            Admin admin = conn.getAdmin();
    
            //调用方法取得带有namespace信息的descriptor
            NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();
    
            for (NamespaceDescriptor namespaceDescriptor : namespaceDescriptors) {
    
                nameSpaces.add(namespaceDescriptor.getName());
    
            }
    
            //关闭admin
            admin.close();
    
            return nameSpaces;
    
        }
    
        //判断库是否存在
        public  static  boolean  ifNSExists(Connection conn,String nsName) throws IOException {
    
            //校验库名,当字符串为null或者空字符时,返回true
            if (StringUtils.isBlank(nsName)){
    
                logger.error("请输入正确的库名!");
    
                return false;
            }
    
            //获取一个Admin对象
            Admin admin = conn.getAdmin();
    
            try {
                //根据库名获取库的描述,如果库的描述不存在,抛出NamespaceNotFoundException
                admin.getNamespaceDescriptor(nsName);
    
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return  false;
            } finally {
                admin.close();
            }
    
        }
    
    
        // 创建库
        public  static  boolean  createNameSpace(Connection conn,String nsName) throws IOException {
    
            //校验库名
            if (StringUtils.isBlank(nsName)){
    
                logger.error("请输入正确的库名!");
    
                return false;
            }
    
            //获取一个Admin对象
            Admin admin = conn.getAdmin();
    
            try {
                //创建库的描述
                    //此处只能用内部类bulid来创建descriptor对象
                NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nsName).build();
    
                //根据库的描述创建库
                admin.createNamespace(namespaceDescriptor);
    
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
    
            } finally {
                admin.close();
            }
    
        }
    
        // 删除库 只能删除空库,库中有表无法删除
        public  static  boolean dropNameSpace(Connection conn,String nsName) throws IOException {
    
            //判断库是否存在,不存在就不需要删除
            if (!ifNSExists(conn,nsName)){
    
                logger.error("当前库:"+nsName+",不存在!");
    
                return false;
    
            }
    
            //判断库是否是空库
            List<String> tablesInNameSpace = getTablesInNameSpace(conn, nsName);
    
            if (!tablesInNameSpace.isEmpty()){
    
                logger.error("当前库:"+nsName+",非空!");
    
                return false;
    
            }
    
            //获取一个Admin对象
            Admin admin = conn.getAdmin();
    
            try {
                //删库
                admin.deleteNamespace(nsName);
    
                return true;
            } catch (Exception e) {
                e.printStackTrace();
    
                return false;
            } finally {
    
                admin.close();
    
            }
    
        }
    
        //获取库中所有的表
        public static  List<String> getTablesInNameSpace(Connection conn,String nsName) throws IOException {
    
            ArrayList<String> tableNames = new ArrayList<>();
    
            //获取一个Admin对象
            Admin admin = conn.getAdmin();
    
            TableName[] tableNames1 = admin.listTableNamesByNamespace(nsName);
            for (TableName tableName : tableNames1) {
                tableNames.add(tableName.toString());
            }
    
            //关闭admin
            admin.close();
    
            return tableNames;
    
    
        }
    
    }

    三、针对表的操作

    import org.apache.commons.lang.StringUtils;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.Connection;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.IOException;
    
    /**
     * Created by VULCAN on 2020/3/20
     */
    public class TableUtil {
    
        private  static Logger logger= LoggerFactory.getLogger(TableUtil.class);
    
    
        //判断表名是否合法,如果合法返回表的TableName,如果不合法,返回null
        public static TableName checkTableName(String tableName, String nsname){
    
            //验证表名是否合法
            if (StringUtils.isBlank(tableName)){
    
                logger.error("请输入正确的表名!");
    
                return null;
    
            }
    
            return  TableName.valueOf(nsname,tableName);
    
        }
    
        //判断表是否存在
        public static boolean ifTableExists(Connection connection, String tableName, String nsname) throws IOException {
    
            //验证表名是否合法
            TableName tn = checkTableName(tableName, nsname);
    
            if (tn==null){
    
                return false;
            }
    
            Admin admin = connection.getAdmin();
    
            boolean tableExists = admin.tableExists(tn);
    
            admin.close();
    
            return tableExists;
    
        }
    
        //创建表
        public static boolean createTable(Connection connection, String tableName, String nsname,String...cfs) throws IOException {
    
            //验证表是否存在
            if(ifTableExists(connection,tableName, nsname)){
    
                logger.warn(tableName+"已经存在!无需再创建!");
    
                return false;
    
            };
    
            TableName tn = checkTableName(tableName, nsname);
    
            if (cfs.length<1){
    
                logger.warn("至少需要指定一个列族!");
    
                return false;
    
            }
    
            Admin admin = connection.getAdmin();
    
            //创建表的描述和定义
            HTableDescriptor hTableDescriptor = new HTableDescriptor(tn);
    
            //列族需要在表的描述和定义中指定
    
            for (String cf : cfs) {
    
                //定义列族
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
    
                //可以调用列族的set()方法设置列族的属性
               // hColumnDescriptor.setVersions()
    
                hTableDescriptor.addFamily(hColumnDescriptor);
    
            }
            //基于表的描述创建表
            admin.createTable(hTableDescriptor);
    
            admin.close();
    
            return true;
    
        }
    
    
        //删除表
        public static boolean dropTable(Connection connection, String tableName, String nsname) throws IOException {
    
            //验证表是否存在
            if(!ifTableExists(connection,tableName, nsname)){
    
                logger.warn(tableName+"不存在!无法删除!");
    
                return false;
    
            };
    
            //获取表名
            TableName tn = checkTableName(tableName, nsname);
    
            Admin admin = connection.getAdmin();
    
            //删除前,需要先disable表
            admin.disableTable(tn);
    
            //删除表
            admin.deleteTable(tn);
    
            admin.close();
    
            return true;
    
        }
    
    }

     四、针对数据的操作

    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.*;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import java.io.IOException;
    
    /**
     * Created by VULCAN on 2020/3/21
     */
    public class DataUtil {
    
        //返回指定表名的Table对象
        public static Table getTableByName(Connection conn,String nsName,String tableName) throws IOException {
    
            TableName tn = TableUtil.checkTableName(tableName, nsName);
    
            if (tn == null){
    
                return null;
    
            }
    
           return conn.getTable(tn);
    
        }
    
        //put    put 表名  rowkey 列族名:列名  值  [时间戳]  put是向某一行的某列添加一个value
        public static void put(Connection conn,String nsName,String tableName,String rowkey,String cfName,String cqName,String value) throws IOException {
    
            Table table = getTableByName(conn, nsName, tableName);
    
            if (table==null){
                return ;
            }
    
            //使用Table进行put操作
            // put对象需要基于rowkey构建
            Put put = new Put(Bytes.toBytes(rowkey));
    
            //向put对象中封装参数
            put.addColumn(Bytes.toBytes(cfName),Bytes.toBytes(cqName),Bytes.toBytes(value));
                   // .addColumn().addColumn()
    
            table.put(put);
    
            table.close();
    
        }
    
        //get  查询一行的内容  get 表名 rowkey [列名]
        public  static  Result get(Connection conn,String nsName,String tableName,String rowkey) throws IOException {
            
            //获取表对象
            Table table = getTableByName(conn, nsName, tableName);
    
            if (table==null){
                return null;
            }
            
            //构建get对象
            Get get = new Get(Bytes.toBytes(rowkey));
            
            //向get中,封装查询的参数
            //只查询某个列
           // get.addColumn()
            // 只查某个列族
            //get.addFamily()
            //只查某个版本
            //get.setTimeStamp()
            //设置查询的最大版本数量
            ///get.setMaxVersions()
    
            Result result = table.get(get);
    
            table.close();
    
            return result;
    
        }
    
        //遍历单行Result中的数据
        public static  void  parseResult(Result result){
    
            if (result !=null){
    
                //遍历这一行内容所有的Cell
                Cell[] cells = result.rawCells();
    
                for (Cell cell : cells) {
                    //利用Cell Util的clonexxx来获取相应的值
    
                    System.out.println("Row:"+ Bytes.toString(CellUtil.cloneRow(cell)));
                    System.out.println("Family:"+ Bytes.toString(CellUtil.cloneFamily(cell)));
                    System.out.println("Qualifier:"+ Bytes.toString(CellUtil.cloneQualifier(cell)));
                    System.out.println("Value:"+ Bytes.toString(CellUtil.cloneValue(cell)));
    
                    System.out.println("-----------------------------------------");
    
                }
    
            }
    
        }
    
        //scan
        public static void  scan(Connection conn,String nsName,String tableName) throws IOException {
    
            //获取表对象
            Table table = getTableByName(conn, nsName, tableName);
    
            if (table==null){
                return ;
            }
    
            //scan代表一个扫描器
            Scan scan = new Scan();
            
            //在scan中设置要扫描的参数
            //只扫某些列
            //scan.addColumn()
            //只扫某个列族
            //scan.addFamily()
            // 指定起始行和终止行
            //scan.setStartRow()
            //scan.setStopRow()
            // 专家设置 ,{RAW=>TRUE,VERSIONS=>10}
            // scan.setMaxVersions(10);
            // scan.setRaw(true);
    
            ResultScanner scanner = table.getScanner(scan);
    
            for (Result result : scanner) {
    
                parseResult(result);
    
            }
    
            table.close();
    
        }
    
        //delete  delete 表名 rowkey [列名] [ts]
        public  static  void delete(Connection conn, String nsName, String tableName, String rowkey) throws IOException {
    
            //获取表对象
            Table table = getTableByName(conn, nsName, tableName);
    
            if (table==null){
                return ;
            }
    
            //删除一整行  为当前行的每个列族都添加一条  列族名:  ,type=DeleteFamily的记录
            Delete delete = new Delete(Bytes.toBytes(rowkey));
    
            //删除某个列族  为当前行的指定列族都添加一条  列族名:  ,type=DeleteFamily的记录
           // delete.addFamily(Bytes.toBytes("cf1"));
    
            // 删除某个列  为指定列添加一条 列族名:列名,type=Delete的记录  删除当前列最新版本的cell,如果
            // 有历史版本,历史版本是可见的
           // delete.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("name"));
    
            //删除指定列的所有版本  为指定的列添加一条 列族名:列名, type=DeleteColumn的记录
            delete.addColumns(Bytes.toBytes("cf1"),Bytes.toBytes("name"));
    
            table.delete(delete);
    
            table.close();
    
        }
    }
  • 相关阅读:
    电影记录管理系统 修改与注释,完整代码
    Mybatis用法小结
    springMVC中传值的时候的乱码问题
    MAVEN安装过程
    树形结构的数据库表Schema设计
    SpringMVC的工作原理
    页面底部的回到顶部的按钮实现
    鼠标放上去,div高度随文字增加,并显示剩余的文字。
    freeMarker中list的两列展示
    html的textarea控制字数小案例
  • 原文地址:https://www.cnblogs.com/yangxusun9/p/12534742.html
Copyright © 2020-2023  润新知