天天看点

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();
    }


}      

案例代码