zoukankan      html  css  js  c++  java
  • HBase API实战案例

                  HBase API实战案例

                                         作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

    一.判断表是否存在

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.HBaseAdmin;
    
    import java.io.IOException;
    
    public class HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(String tableName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            TableName tablename = TableName.valueOf(tableName);
            return admin.tableExists(tablename);
        }
    
        public static void main(String[] args) throws IOException {
            String tableName = "teacher";
    
            boolean exist = isTableExist(tableName);
            if (exist){
                System.out.println(tableName + "表存在");
            }else {
                System.out.println(tableName + "表不存在!");
            }
        }
    }
    案例代码

    二.创建表 

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.HBaseAdmin;
    
    import java.io.IOException;
    
    public class HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(String tableName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            TableName tablename = TableName.valueOf(tableName);
            return admin.tableExists(tablename);
        }
    
        public static void createTable(String tableName, String... columnFamily) throws IOException{
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
    
            //判断表是否存在
            if(isTableExist(tableName)){
                System.out.println("表" + tableName + "已存在");
                System.exit(0);
            }else{
                //创建表属性对象,表名需要转字节
                HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(tableName));
                //创建多个列族
                for(String cf : columnFamily){
                    descriptor.addFamily(new HColumnDescriptor(cf));
                }
                //根据对表的配置,创建表
                admin.createTable(descriptor);
                System.out.println("表" + tableName + "创建成功!");
            }
        }
    
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
    
            createTable(tableName,"professional_skill","project_experience","synopsis");
        }
    }
    案例代码

    三.插入数据 

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    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 HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(TableName tName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            return admin.tableExists(tName);
        }
    
        public static void addRowData(TableName tableName, String rowKey, String columnFamily, String column, String value) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            //获取指定的表对象
            Table hTable = conn.getTable(tableName);
            //向表中插入数据
            Put put = new Put(Bytes.toBytes(rowKey));
            //向Put对象中组装数据
            put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));
            hTable.put(put);
            hTable.close();
            System.out.println("插入数据成功");
        }
     
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            addRowData(tname,"10001","synopsis","name","Jason Yin");
        }
    }
    案例代码

    四.获取某一行数据 

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    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 HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(TableName tName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            return admin.tableExists(tName);
        }
    
        public static void getRow(TableName tableName, String rowKey) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            //获取指定的表对象
            Table hTable = conn.getTable(tableName);
            Get get = new Get(Bytes.toBytes(rowKey));
            //遍历查询结果
            Result result = hTable.get(get);
            for(Cell cell : result.rawCells()){
                System.out.println("行键: " + Bytes.toString(result.getRow()));
                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("时间戳: " + cell.getTimestamp());
            }
        }
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            getRow(tname,"10001");
        }
    }
    案例代码

    五.获取某一行指定列族的列数据 

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    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 HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(TableName tName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            return admin.tableExists(tName);
        }
    
        public static void getRowQualifier(TableName tableName, String rowKey, String family, String qualifier) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            //获取指定的表对象
            Table hTable = conn.getTable(tableName);
            Get get = new Get(Bytes.toBytes(rowKey));
            get.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier));
            Result result = hTable.get(get);
            for(Cell cell : result.rawCells()){
                System.out.println("行键: " + Bytes.toString(result.getRow()));
                System.out.println("列族: " + Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("列: " + Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("值: " + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            getRowQualifier(tname,"10001","synopsis","name");
        }
    }
    案例代码

    六.获取所有数据

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    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 HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(TableName tName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            return admin.tableExists(tName);
        }
    
        public static void getAllRows(TableName tname) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            //获取指定的表对象
            Table hTable = conn.getTable(tname);
            //得到用于扫描region的对象
            Scan scan = new Scan();
            //使用HTable得到resultcanner实现类的对象
            ResultScanner resultScanner = hTable.getScanner(scan);
            for(Result result : resultScanner){
                Cell[] cells = result.rawCells();
                for(Cell cell : cells){
                    //得到rowkey
                    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)));
                }
            }
        }
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            getAllRows(tname);
        }
    }
    案例代码

    七.删除一行数据

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    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 HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static void deleteRow(TableName tName,String rowkey) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            //获取指定的表对象
            Table hTable = conn.getTable(tName);
    
            //删除数据
            Delete delete = new Delete(Bytes.toBytes(rowkey));
            hTable.delete(delete);
            System.out.println("删除数据");
        }
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            deleteRow(tname,"10002");
        }
    }
    案例代码

    八.删除多行数据

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.*;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(TableName tName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            return admin.tableExists(tName);
        }
    
        public static void deleteMultiRow(TableName tname, String... rows) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            //获取指定的表对象
            Table hTable = conn.getTable(tname);
            List<Delete> deleteList = new ArrayList<Delete>();
            for(String row : rows){
                Delete delete = new Delete(Bytes.toBytes(row));
                deleteList.add(delete);
            }
            hTable.delete(deleteList);
            hTable.close();
            System.out.println("数据删除成功....");
        }
    
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            deleteMultiRow(tname,"10001","10003");
        }
    }
    案例代码

    九.删除表

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.HBaseAdmin;
    
    import java.io.IOException;
    
    public class HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static boolean isTableExist(TableName tName) throws  IOException {
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            return admin.tableExists(tName);
        }
    
        public static void dropTable(TableName tName) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();
            if(isTableExist(tName)){
                admin.disableTable(tName);
                admin.deleteTable(tName);
                System.out.println("表" + tName + "删除成功!");
            }else{
                System.out.println("表" + tName + "不存在!");
            }
        }
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            dropTable(tname);
        }
    }
    案例代码
    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.*;
    
    import java.io.IOException;
    
    public class HBaseAPI {
    
        public static Configuration conf;
    
        //获取Configuration对象
        static{
            //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
            conf = HBaseConfiguration.create();
            //如果你没有服务器的配置配置文件,那就得手动配置zookeeper地址及端口
            conf.set("hbase.zookeeper.quorum", "hadoop101.yinzhengjie.org.cn");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static void dropTable(TableName tName) throws IOException{
            //在HBase中管理、访问表需要先创建HBaseAdmin对象
            Connection conn = ConnectionFactory.createConnection(conf);
            Admin admin = conn.getAdmin();
            if (admin.tableExists(tName)){
                //先禁用表
                admin.disableTable(tName);
                //然后再删除表
                admin.deleteTable(tName);
                System.out.println("表已经删除....");
            }
        }
    
        public static void main(String[] args) throws IOException {
            String tableName = "engineer";
            TableName tname = TableName.valueOf(tableName);
            dropTable(tname);
        }
    }
    案例代码二(推荐使用)

    十.过滤器应用案例(无索引定位,因此效率较低,不推荐使用,生产环境中使用建议新建表做二级索引以空间换时间。)

    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.*;
    import org.apache.hadoop.hbase.client.*;
    import org.apache.hadoop.hbase.filter.*;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import java.io.IOException;
    
    public class HBaseAPI {
    
        public static void main(String[] args) throws IOException {
            //创建配置对象
            Configuration conf = HBaseConfiguration.create();
            //获取HBase的连接对象
            Connection conn = ConnectionFactory.createConnection(conf);
            //获取TableName对象
            TableName tableName = TableName.valueOf("yinzhengjie2020:teacher");
    
            Table table = conn.getTable(tableName);
            Scan scan = new Scan();
    
            /**
             * //指定过滤条件,大于等于"10010"的ROWKEY
             *         BinaryComparator bc = new BinaryComparator(Bytes.toBytes("10010"));
             *         Filter f = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,bc);
             *         scan.setFilter(f);
             *
             * //基于正则表示过滤只包含3个数字的行
             *         RegexStringComparator rsc = new RegexStringComparator("^\d{3}$");
             *         Filter f = new RowFilter(CompareFilter.CompareOp.EQUAL,rsc);
             *         scan.setFilter(f);
             *
             *  FilterList.Operator.MUST_PASS_ALL :
             *      表示AND关系.
             *  FilterList.Operator.MUST_PASS_ONE:
             *      表示OR的关系
             */
            FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);
            BinaryComparator bc = new BinaryComparator(Bytes.toBytes("10010"));
            RegexStringComparator rsc = new RegexStringComparator("^\d{3}$");
            Filter f = new RowFilter(CompareFilter.CompareOp.EQUAL,rsc);
            RowFilter rf = new RowFilter(CompareFilter.CompareOp.EQUAL,bc);
            list.addFilter(f);
            list.addFilter(rf);
            /**
             *  扫描数据时,增加过滤器(效率较低,不推荐使用)
             *      所谓的过滤,其实每条数据都会筛选过滤,性能比较低,因此生产环境中使用时建议新建一张表做二级索引(以空间换时间)。
             */
            scan.setFilter(list);
            ResultScanner scanner = table.getScanner(scan);
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();
                for(Cell cell : cells){
                    //得到rowkey
                    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)));
                }
            }
            //释放资源
            table.close();
            conn.close();
        }
    }
    案例代码

    十一.HBase API封装思路

    package cn.org.yinzhengjie.bigdata.hbase.util;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Put;
    import org.apache.hadoop.hbase.client.Table;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import java.io.IOException;
    
    /**
     * HBase操作工具类
     */
    public class HBaseUtil {
    
        //创建ThreadLocal对象(会在各个线程里单独开辟一块共享内存空间),目的是为了同一个线程内实现数据共享,它的作用并不是解决线程安全问题哟~
        private static ThreadLocal<Connection> connHolder = new ThreadLocal<Connection>();
    
        /**
         *  将构造方法私有化,禁止该工具类被实例化
         */
        private HBaseUtil(){}
    
    
        /**
         *  获取HBase连接对象
         */
        public static void makeHbaseConnection() throws IOException {
            //获取连接
            Connection conn = connHolder.get();
    
            //第一次获取连接为空,因此需要手动创建Connection对象
            if (conn == null){
                //使用HBaseConfiguration的单例方法实例化,该方法会自动帮咱们加载"hbase-default.xml"和"hbase-site.xml"文件.
                Configuration conf = HBaseConfiguration.create();
                conn = ConnectionFactory.createConnection(conf);
                connHolder.set(conn);
            }
        }
    
        /**
         *  增加数据
         */
        public static void insertData (String tableName, String rowKey, String columnFamily, String column, String value)
                throws IOException{
            //获取连接
            Connection conn = connHolder.get();
            //获取表
            Table table = conn.getTable(TableName.valueOf(tableName));
            //创建Put对象,需要指定往哪个"RowKey"插入数据
            Put put = new Put(Bytes.toBytes(rowKey));
            //记得添加列族信息
            put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value));
            //执行完这行代码数据才会被真正写入到HBase哟~
            table.put(put);
            //记得关闭表
            table.close();
        }
    
        /**
         *  关闭连接
         */
        public static void close() throws IOException {
            //获取连接
            Connection conn = connHolder.get();
            if (conn != null){
                conn.close();
                //关闭连接后记得将其从ThreadLocal的内存中移除以释放空间。
                connHolder.remove();
            }
        }
    }
    HBaseUtil.java(工具类模板)
    package cn.org.yinzhengjie.bigdata.hbase;
    
    import cn.org.yinzhengjie.bigdata.hbase.util.HBaseUtil;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    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 HBaseAPI {
    
        public static void main(String[] args) throws IOException {
    
            //获取HBase连接对象
            HBaseUtil.makeHbaseConnection();
    
            //插入数据
            String tableName = "yinzhengjie2020:teacher"; //指定表名称
            String rowkey = "10010";     //指定rowkey
            String family = "synopsis";     //指定列族
            String column = "name";         //指定字段
            String value = "尹正杰";      //指定字段对应的值
            HBaseUtil.insertData(tableName,rowkey,family,column,value);
    
            //关闭连接
            HBaseUtil.close();
        }
    }
    HBaseAPI.java(调用自己封装的HBase API)

    十二.小试牛刀

      先判断"yinzhengjie2020:teacher"表是否存在,若不存在则创建该表,表中有一个"synopsis"列族,该列族有一个字段名为"name",其值为"JasonYin"。
      使用HBase API查询"yinzhengjie2020:teacher"表中的数据.
    package cn.org.yinzhengjie.bigdata.hbase;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.*;
    import org.apache.hadoop.hbase.client.*;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import java.io.IOException;
    
    /**
     * 测试HBase API
     */
    public class TestHbaseAPI {
    
        public static void main(String[] args) throws IOException {
            //创建配置对象,获取HBase连接
            Configuration conf = HBaseConfiguration.create();
    
            //获取HBase的连接对象
            Connection conn = ConnectionFactory.createConnection(conf);
    
            //获取操作对象
            Admin admin = conn.getAdmin();
    
            //操作数据库
            //判断命名空间是否存在,若不存在就创建该命名空间.
            try {
                admin.getNamespaceDescriptor("yinzhengjie2020");
            }catch (NamespaceNotFoundException e){
                NamespaceDescriptor nd = NamespaceDescriptor.create("yinzhengjie2020").build();
                admin.createNamespace(nd);
            }
            //判断HBase中的表是否存在,若不存在就创建该表
            TableName tablename = TableName.valueOf("yinzhengjie2020:teacher");     //创建TableName对象
            boolean flag = admin.tableExists(tablename);
            if (flag){
                //获取指定的表对象
                Table table = conn.getTable(tablename);
                //查询数据
                String rowkey = "100001";
                //Bytes.toBytes工具会进行字符编码,默认转换为"UTF-8"
                Get get = new Get(Bytes.toBytes(rowkey));
                //获取查询结果
                Result result = table.get(get);
                boolean empty = result.isEmpty();
                if (empty){
                    //新增数据
                    Put put = new Put(Bytes.toBytes(rowkey));
                    String family = "synopsis";     //指定列族
                    String column = "name";         //指定字段
                    String value = "JasonYin";      //指定字段对应的值
                    put.addColumn(Bytes.toBytes(family),Bytes.toBytes(column),Bytes.toBytes(value));
                    table.put(put);                 //执行完这行代码数据才会被真正写入到HBase哟~
                    System.out.println("数据增加成功....");
                }else {
                    //展示数据
                    for (Cell cell : result.rawCells()) {
                        //使用Cell的工具类直接拿到咱们想要的数据
                        System.out.println("RowKey = " + Bytes.toString(CellUtil.cloneRow(cell)));
                        System.out.println("Family = " + Bytes.toString(CellUtil.cloneFamily(cell)));
                        System.out.println("Column = " + Bytes.toString(CellUtil.cloneQualifier(cell)));
                        System.out.println("Value = " + Bytes.toString(CellUtil.cloneValue(cell)));
                    }
                }
            }else {
                //创建表描述对象
                HTableDescriptor tableDescriptor = new HTableDescriptor(tablename);
                //增加列族
                HColumnDescriptor synopsis = new HColumnDescriptor("synopsis");
                tableDescriptor.addFamily(synopsis);
                //创建表
                admin.createTable(tableDescriptor);
                System.out.println("表创建成功....");
            }
    
            //关闭数据库连接
            conn.close();
        }
    
    
    }
    案例代码
  • 相关阅读:
    jq 切换功能toggle
    打开控制台F12弹出弹窗
    CSS解决无空格太长的字母,数字不会自动换行的问题
    微信公众号页面无法唤起输入框
    别人遇到的两条前端面试题
    在HTML打开已安装的App,未安装跳转到对应的下载链接
    promise的使用
    特殊的json对象转数组,最合成新的json数据
    Rem兼容知多少?
    parseInt的结果看不懂,请看我分析
  • 原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12271220.html
Copyright © 2011-2022 走看看