3.HBase的基本操作

HBase的基本操作

HBase获取connection和其他API获取连接的步骤一样,通过连接工场获取,HBase比较老的API中还有连接池的概念,有的介绍文献中说连接池并没有起到实际作用,HBase新的API中也将连接池标记为已过时,不过像如下通过获取连接-操作-关闭的方式,在有的业务中并不适合,因为HBase或取连接时比较耗时,在实际使用时还是依据业务,尽量避免HBase connection 频繁的关闭和开启。


public class HBaseHelper {


    private static final Logger LOGGER = LoggerFactory.getLogger(HBaseHelper.class);

    private static final String NULL_STRING=new String();

    public static Connection getConnection(){  

        Connection conn=null; 
        try {
            /**
             * 在创建的时候回去class文件的根目录先去找 hbase-site.xml文件。
             */
            Configuration conf=HBaseConfiguration.create();  
            conn=ConnectionFactory.createConnection(conf);
        } catch (IOException e) {
            LOGGER.error("Hbase connection error please check the configuration");
        }
        return conn; 
    }

    /**
     * 创建数据表
     */
    public static void createTable(String table, byte[][] splitKeys,String... familys) {
        Connection connection=getConnection();
        Admin admin=null;
        try {
            admin = connection.getAdmin();
            if (admin.tableExists(TableName.valueOf(table))) {
                LOGGER.error("table : " + table + " is exist");
                return;
            }

            HTableDescriptor tableDescriptor = new HTableDescriptor(
                    TableName.valueOf(table));
            for (String family : familys) {
                HColumnDescriptor familyDescriptor = new HColumnDescriptor(family);
                tableDescriptor.addFamily(familyDescriptor);
            }
            if (splitKeys != null) {
                admin.createTable(tableDescriptor, splitKeys);
            } else {
                admin.createTable(tableDescriptor);
            }
        } catch (MasterNotRunningException e) {
            LOGGER.error("HBase Master not running ", e);
        } catch (ZooKeeperConnectionException e) {
            LOGGER.error("ZooKeeper Connection error ", e);
            e.printStackTrace();
        } catch (IOException e) {
            LOGGER.error("Hbase IO Exception ", e);
            e.printStackTrace();
        } finally{
            close(admin);
            close(connection);
        }

    }

    public static void createTable(String table, String... familys) {
        HBaseHelper.createTable(table, null, familys);
    }

    /**
     * 删除数据表
     */
    public static void deleteTable(String table) {
        Connection connection=getConnection();
        Admin admin=null;
        try {
            admin = connection.getAdmin();
            if (!admin.tableExists(TableName.valueOf(table))) {
                LOGGER.error("table : " + table + " doesn't exist");
                return;
            }
            admin.disableTable(TableName.valueOf(table));
            admin.deleteTable(TableName.valueOf(table));
        } catch (MasterNotRunningException e) {
            LOGGER.error("HBase Master not running ", e);
        } catch (ZooKeeperConnectionException e) {
            LOGGER.error("ZooKeeper Connection error ", e);
            e.printStackTrace();
        } catch (IOException e) {
            LOGGER.error("Hbase IO Exception ", e);
            e.printStackTrace();
        } finally{
            close(connection);
        }

    }
    /**
     * 添加
     */

    public static void add(String tableName, String rowKey, String family, Map<String,byte[]> data){
        Connection connection=getConnection();
        Table table = null;
        try {
            table = connection.getTable(TableName.valueOf(tableName));
            List<Put> puts=new ArrayList<Put>();
            for(Map.Entry<String, byte[]> entry:data.entrySet()){
                Put put = new Put(Bytes.toBytes(rowKey));
                put.addColumn(family.getBytes(), entry.getKey().getBytes(), entry.getValue());
                puts.add(put);
            }
            table.put(puts);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            close(connection);
        }
    }
    /**
     * 删除
     */
    public static void delete(String tableName, String rowKey){
        Connection connection=getConnection();
        Table table=null;
        try {
            table = connection.getTable(TableName.valueOf(tableName));
            Delete delete = new Delete(Bytes.toBytes(rowKey));
            table.delete(delete);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            close(table);
            close(connection);
        }
    }


    /**
     * 查找  返回 Map对象
     */
    public static Map<String,byte[]> find(String tableName, String rowKey, String family){
        Map<String,byte[]> data=null;
        Connection connection=getConnection();
        Table table=null;
        try {
            table = connection.getTable(TableName.valueOf(tableName));
            Get get = new Get(Bytes.toBytes(rowKey));
            Result result = table.get(get);
            data=HBaseConvetorUtil.toMap(result, family);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            close(table);
            close(connection);
        }
        return data;
    }

    public static <T> T find(Class<T> clazz,String tableName,String id,String family) throws Exception{
        T data=null;
        Connection connection=getConnection();
        Table table=null;
        try {
            table = connection.getTable(TableName.valueOf(tableName));
            Get get = new Get(Bytes.toBytes(id));
            Result result = table.get(get);
            data=HBaseConvetorUtil.toObject(clazz, result, family);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            close(table);
            close(connection);

        }
        return data;
    }

    private static ResultScanner getList(Table table, Filter filter) throws IOException{
        Scan scan = new Scan();
        if(filter!=null){
            scan.setFilter(filter);
        }
        ResultScanner resultScanner = table.getScanner(scan);
        return resultScanner;
    }
    public static List<Map<String,byte[]>> find(String tableName, Filter filter,String family){
        List<Map<String,byte[]>> data= null;
        Connection connection=getConnection();
        Table table=null;
        ResultScanner resultScanner=null;
        try {
            table = connection.getTable(TableName.valueOf(tableName));
            resultScanner=getList(table,filter);
            data = HBaseConvetorUtil.toMap(resultScanner, family);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            close(table);  
            close(connection);
            resultScanner.close();
        }
        return data;
    }

    public static <T> List<T> find(Class<T> clazz,String tableName,Filter filter,String family) throws Exception{
        Connection connection=getConnection();
        Table table=null;
        ResultScanner resultScanner=null;
        List<T> data=null;
        try {
            table = connection.getTable(TableName.valueOf(tableName));
            resultScanner=getList(table,filter);
            data = HBaseConvetorUtil.toObject(clazz,resultScanner, family);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            close(table);
            close(connection);
            close(resultScanner);
        }
        return data;
    }

    public static String getString(Result result,String family,String qualifier){
        byte[] rs=result.getValue(family.getBytes(), qualifier.getBytes());
        if(rs==null){
            return NULL_STRING;  //此处不能设置为空,如果设置为空,在hadoop序列化的时候会出现空指针异常
        }
        return new String(rs);
    }

    public static int getInt(Result result,String family,String qualifier){
        byte[] rs=result.getValue(family.getBytes(), qualifier.getBytes());
        if(rs==null){
            return 0;
        }
        return Bytes.toInt(rs);
    }
    public static long getLong(Result result,String family,String qualifier){
        byte[] rs=result.getValue(family.getBytes(), qualifier.getBytes());
        if(rs==null){
            return 0L;
        }
        return Bytes.toLong(rs); //该方法给出lang值时为固定长度
    }
    public static void close(Table table){
        if(table!=null){
            try {
                table.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(Admin admin){
        if(admin!=null){
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(Connection conn){
        if(conn!=null){
            try {
                conn.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(ResultScanner resultScanner){
        if(resultScanner!=null){
          resultScanner.close();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值