美文网首页
HbaseAPI工具类的创建

HbaseAPI工具类的创建

作者: 须臾之北 | 来源:发表于2018-09-12 22:40 被阅读43次

    HbaseAPI工具类的创建

    知识梳理

    1. 表的管理

    • HBaseAdmin

      • 管理表(创建/删除)
    • HTableDescriptor

      • 表描述器,用来创建表
    • HcolumnDescriptor

      • 列描述器,用来构建列族

    2. 表中数据操作

    • Table

      • 用来表中数据的操作(添加数据/删除数据)
    • Put

      • 用来封装待添加的数据
    • Delete

      • 用来存放待删除的数据

    3. 表中数据的获取

    • Scan

      • 用于设置扫描表的配置信息,默认全部扫描
    • ResultScanner

      • 通过配置的扫描器,得到一个扫描表的实例扫描器
    • Result

      • 每一个该类的实例化对象,都对应一个rowkey中若干数据,可直接通过Result得到rowkey
    • Cell

      • 封装一个row key下所有的单元格中的数据

      • 包括rowKey;columnFamily;column;vlue

    • Get

      • 用于得到某一具体列数据

    工具类创建HBaseUtil

    public class HBaseUtil {
        private static Configuration conf;
        private static Logger logger= Logger.getLogger(HBaseUtil.class);
        
        static {
            conf = HBaseConfiguration.create();
            conf.set("hbase.rootdir", "hdfs://master:9000/hbase");
            conf.set("hbase.zookeeper.quorum","master:2181,slave1:2181,slave2:2181");
        }
        
        /**
         *  判断表是否存在
         *  用到
         *      HBaseAdmin
         *          admin.tableExists(TableName.valueOf(tableName));
         *  
         *  @author anna 
         *  @throws IOException 
         *  @throws ZooKeeperConnectionException 
         *  @throws MasterNotRunningException 
         */
        public static boolean isExist(String tableName) throws IOException{     
            logger.info("正在调用isExist()方法,判断" + tableName + "是否存在");
            
            //老API
    //      HBaseAdmin admin = new HBaseAdmin(conf);        
            
            //新API
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式
            Admin admin = connection.getAdmin();
            
            return admin.tableExists(TableName.valueOf(tableName));
            //Bytes.toBytes(tableName);——此方法在Admin中没有
        }
        
        /**
         *  Hbase表的创建
         *  用到
         *      HBaseAdmin              用于管理表——创建表      admin.createTable(HTableDescriptor)
         *      HTableDescriptor        用于描述表               参数为TableName.valueOf(tableName)
         *      HColumnDescriptor       用于描述列族          参数为String
         *
         *  @author anna 
         */
        public static void createTable(String tableName,String... columnFamily) throws Exception {
            
            logger.info("正在调用createTable()方法创建表"+ tableName);
            
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式
            Admin admin = connection.getAdmin();
            
            //判断表是否存在
            if(isExist(tableName)) {
                throw new Exception("表已存在,不可重复创建");
            }else{
                //创建表描述器
                HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
                
                for (String family : columnFamily) {
                    desc.addFamily(new HColumnDescriptor(family));
                }
                    
                //创建表
                admin.createTable(desc);
                logger.info(tableName + "表成功创建");
            }       
        }
        
        /**
         *  批量创建表 
         *
         *  此时用Map集合来封装表名称和列族
         *  HashMap<String,String[]>    key为tableName,value为String[]数组的columnFamily
         * @throws Exception 
         */
        public static void createMultiTables(Map<String,String[]> map) throws Exception {
            logger.info("正在调用createMultiTable()创建表");
    
            for (Entry<String, String[]> entry : map.entrySet()) {          
                //1. 获取tableName和columnFamily
                
                //1.1 获取tableName
                String tableName = entry.getKey();
                
                //1.2 获取columnFamily
                String[] columnFamily = entry.getValue();
                
                //创建表
                createTable(tableName, columnFamily);
            }
        }
        
    
        /**
         *  Hbase表的删除
         *      HBaseAdmin              用于管理表——删除表      admin.deleteTable(TableName.valueOf(tableName))
         *  
         *      删除表前判断表是否disabled
         *      admin.isTableDisabled(TableName.valueOf(tableName)
         *      
         *  @author anna 
         * @throws Exception 
         */
        public static void deleteTable(String tableName) throws Exception {
            
            logger.info("正在调用deleteTable删除表" + tableName);
            
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式
            Admin admin = connection.getAdmin();
            
            if(isExist(tableName)) {
                
                if(!admin.isTableDisabled(TableName.valueOf(tableName))) {
                    //disable
                    admin.disableTable(TableName.valueOf(tableName));
                }       
                
                //删除表
                admin.deleteTable(TableName.valueOf(tableName));
                logger.info(tableName + "表删除成功=======");
            }else {
                throw new Exception(tableName + "表不存在,无法进行删除");
            }       
        }
        
        /**
         *  批量删除表
         *  List<String>中封装tableName集合 
         * @throws Exception 
         */ 
        public static void deleteMultiTables(List<String> list) throws Exception {      
            for (String tableName : list) {
                deleteTable(tableName);     
            }               
        }
        
        /**
         *  向Hbase中添加一行数据
         *      1. 获取表
         *          connection.getTable(TableName.valueOf(tableName));
         *      
         *      2. 用到Table进行表中数据的操作
         *          table.put(put);
         *
         *      3. Put用来封装待存放的数据
         *          new Put(Bytes.toBytes(rowKey))
         *          addColumn(columnFamily,column,value);
         *          
         *              
         *  @author anna
         * @throws IOException 
         */
        public static void addRow(String tableName,String rowKey,String columnFamily,String column,String value) throws IOException {
            
            logger.info("正在调用addRow方法,向" + tableName + "表中添加数据");
            
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式
            
            //获取表
            Table table = connection.getTable(TableName.valueOf(tableName));
            
            //封装待存放的对象
            Put put = new Put(Bytes.toBytes(rowKey));           //rowkey封装      
            put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value));      //指定列族,列名,存放的数据
            
            //添加数据
            table.put(put);     //可以传入Put对象的集合
        }
        
        /**
         *  删除单行数据
         * @throws IOException 
         */
        public static void deleteMultiRow(String tableName,String rowKey) throws IOException {
            logger.info("正在调用deleteMultiRow方法,删除" + tableName + "表中rowKey为"+ rowKey + "的数据");
            
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式                    
            Table table = connection.getTable(TableName.valueOf(tableName));        //获取表
            
            Delete delete = new Delete(Bytes.toBytes(rowKey));
            table.delete(delete);   
        }
        
        /**
         *  删除多行数据
         * @throws IOException 
         */
        public static void deleteMultiRow(String tableName,List<String> rowKeys) throws IOException {
            logger.info("正在调用deleteMultiRow方法,删除" + tableName + "表中"+ "多行数据");
            
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式    
            
            //获取表
            Table table = connection.getTable(TableName.valueOf(tableName));
            
            //批量删除
            List<Delete> list = new ArrayList<>();
            for (String rowKey : rowKeys) {
                
                Delete delete = new Delete(Bytes.toBytes(rowKey));
                list.add(delete);
            }
            
            //批量删除多行                        
            table.delete(list);                                 //批处理效率更高
        }
        
        /**
         *  扫描数据——得到所有数据
         *      仍旧是对表中数据的操作,还是Table对象
         *
         *  ——  设置扫描表的配置信息  Scan
         *      默认全部扫描
         *
         *  ResultScanner:通过配置的扫描器,得到一个扫描表的实例扫描器
         *
         *  Result: 每一个该类的实例化对象,都对应一个rowKey中的若干数据
         *          可直接得到row key
         *
         *  Cell: 封装一个row Key下所有单元格中的数据(rowKey,columnFamily,Column,value)
         * @throws IOException 
         */ 
        public static void getAllRows(String tableName) throws IOException {
            logger.info("正在调用getAllRows方法,扫描表" + tableName );
            
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式    
            
            //获取表
            Table table = connection.getTable(TableName.valueOf(tableName));
            
            Scan scan = new Scan();                     //扫描表的配置信息
    //      scan.setMaxVersions();
            
            ResultScanner scanner = table.getScanner(scan);
            
            for (Result result : scanner) {
                
    //          System.out.println(Bytes.toString(result.getRow()));        也可以获取到row key
                
                Cell[] rawCells = result.rawCells();            //获取所有的cell
                
                for (Cell cell : rawCells) {
                    System.out.println("行健:" + Bytes.toString(CellUtil.cloneRow(cell)));
                    System.out.println("行健:" +  Bytes.toString(CellUtil.cloneFamily(cell)));
                    System.out.println("行健:" +  Bytes.toString(CellUtil.cloneQualifier(cell)));
                    System.out.println("行健:" +  Bytes.toString(CellUtil.cloneValue(cell)));
                    
                    System.out.println("------------------");
                }
            }       
        }
        
        /**
         *  得到指定列数据
         */
        public static void getRow(String tableName,String rowKey,String columnFalily,String column) throws IOException {
            logger.info("正在调用getRow方法,获取表" + tableName + "中,rowKey为" + rowKey + "的数据");
            
            Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式    
            
            //获取表
            Table table = connection.getTable(TableName.valueOf(tableName));
            
            
            Get get = new Get(Bytes.toBytes(rowKey));
            get.addColumn(Bytes.toBytes(columnFalily),Bytes.toBytes(column));   //设置要获取的列族和列
            
            Result result = table.get(get);
            
            Cell[] rawCells = result.rawCells();            //获取所有的cell
            
            for (Cell cell : rawCells) {
                System.out.println("行健:" + Bytes.toString(CellUtil.cloneRow(cell)));
                System.out.println("行健:" +  Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("行健:" +  Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("行健:" +  Bytes.toString(CellUtil.cloneValue(cell)));
                
                System.out.println("------------------");
            }       
        }
    }
    

    相关文章

      网友评论

          本文标题:HbaseAPI工具类的创建

          本文链接:https://www.haomeiwen.com/subject/gmcigftx.html