HbaseAPI工具类的创建

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    key为tableName,value为String[]数组的columnFamily
     * @throws Exception 
     */
    public static void createMultiTables(Map map) throws Exception {
        logger.info("正在调用createMultiTable()创建表");

        for (Entry 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中封装tableName集合 
     * @throws Exception 
     */ 
    public static void deleteMultiTables(List 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 rowKeys) throws IOException {
        logger.info("正在调用deleteMultiRow方法,删除" + tableName + "表中"+ "多行数据");
        
        Connection connection = ConnectionFactory.createConnection(conf);       //工厂设计模式    
        
        //获取表
        Table table = connection.getTable(TableName.valueOf(tableName));
        
        //批量删除
        List 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工具类的创建)