Java 操作HBase

思路

1.建立连接

2.针对表的操作(创建表、删除表、判断表是否存在、使用/禁用表、列出表)

3.针对数据的操作(添加、删除、修改、查看)

4.关闭连接

HBase常用的Java API

Java API 接口 :可以理解为别人封装好的方法,可以直接调用

(一)Admin

管理HBase数据库信息(包括创建、删除表、列出表项、使表有效/无效、添加/删除表的列族成员、检查HBase运行状态等)

方法名释义
addColumn添加列族
createTable创建表
deleteTable删除表
disableTable使表无效
enableTable使表有效
tableExists判断表是否存在
listTable列出所有表项
(二)HBaseConfiguration

管理HBase的配置信息

方法名释义
create创建Configuration
(三)Table

Connection.getTable()返回Table的一个子对象,用于与HBase进行通信

方法名释义
close关闭
delete删除(单元格、行)
exists检查指定的Get对象是否存在
get获取指定的值
put添加数据
HTableDescriptor获取HTableDescriptor实例
getName获取当前表格的名字实例
(四)HTableDescriptor

HTableDescriptor包含了HBase中的表格的详细信息(例如表中的列族、表的类型、表是否只读、MemoStore的最大空间、Region分裂时机等)

方法名释义
addFamily添加列族
getFamilies返回表中所有列族的名字
getTableName返回表的名字实例
getValue获取某个属性的值
removeFamily删除某个列族
setValue设置属性的值
(五)HColumnDescriptor

HColumnDescriptor包含了列族的详细信息(例如列族的版本号、压缩设置等)。HColumnDescriptor通常在添加列族或者创建表时使用。列族一旦建立就不能被修改,只能通过删除再重新创建的方式来间接修改。一旦列族被删除,则其中包含的数据也会被删除

方法名释义
getName获取列族的名字
getValue获取单元格的值
setValue设置单元格的值
(六)Put

用来对单元格执行添加数据的操作

方法名释义
add将指定的列族、列对应的值添加到Put实例中
get获取列族和列限定符指定列中的所有单元格的值
(七)Get

用来获取当行的信息

方法名释义
addColumn根据列族和列限定符获取对应列
setFilter为获取具体的列设置相应的过滤器
(八)Result

用于存放Get或者Scan操作后的查询结果,以<key, value>的格式存储在map结构中。

该类不是线程安全的

方法名释义
containsColumn检查是否包含列族和列限定符指定的列
getColumnCells获得列族和列限定符指定列的列中的所有单元格
getValue获得列族和列限定符指定的单元格的最新值
(九)Scan

可以用Scan来限定需要查找的数据(包括但是不限于限定版本号、起始行号、终止行号、列族、列限定符、返回值的数量上限)

方法名释义
addFamily限定需要查找的列族
addColumn限定列族和列限定符指定的列
setFilter指定Filter来过滤掉不需要的数据
setStartRow限定开始的行,否则从表头开始
setStopRow限定结束的行(不包含此行)
setBatch限定最多返回的单元格数目。用于防止返回过多的数据导致OutofMemory(内存溢出)错误

Java 操作HBase实例

(一)编辑pom.xml文件

往其中添加

        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.4.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.4.13</version>
        </dependency>
(二)编写操作HBase的文件ExampleForHBase.java

实例说明

1.创建一个学生信息表,用来存储学生的姓名(姓名作为行键,且假设姓名不会重复)以及考试成绩,其中考试成绩(score)是一个列族,存储了各个科目的考试成绩。然后向student中添加数据

2.student表结构及数据

namescore
English MathComputer
zhangsan 69 8677
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.*;

import java.io.IOException;

public class ExampleForHBase {

    public static Configuration conf;//管理HBase的配置信息
    public static Connection conn;//管理HBase的连接
    public static Admin admin;//管理HBase数据库的连接

    /**
     * 创建相关连接
     *
     * @throws IOException 可能出现的异常
     */
    public static void init() throws IOException {
        conf = HBaseConfiguration.create();
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        conf.set("HADOOP_USER_NAME", "hadoop");
        conf.set("hbase.root.dir", "hdfs://master:9000/hbase");
        conf.set("hbase.zookeeper.quorum", "master");//配置Zookeeper的ip地址
        conf.set("hbase.zookeeper.property.clientPort", "2181");//配置zookeeper的端口

        conn = ConnectionFactory.createConnection(conf);
        admin = conn.getAdmin();
    }

    /**
     * 关闭所有连接
     *
     * @throws IOException 可能出现的异常
     */
    public static void close() throws IOException {
        if (admin != null)
            admin.close();
        if (conn != null)
            conn.close();
    }

    /**
     * 创建表
     * @param myTableName 表名
     * @param colFamily 列族名的数组
     * @throws IOException 可能出现的异常
     */
    public static void createTable(String myTableName, String[] colFamily) throws IOException {
        TableName tableName = TableName.valueOf(myTableName);
        if (admin.tableExists(tableName)) {
            System.out.println(myTableName + "表已经存在");
        } else {
            HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
            for (String str : colFamily) {
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
                hTableDescriptor.addFamily(hColumnDescriptor);
            }
            admin.createTable(hTableDescriptor);
        }
    }

    /**
     * 添加数据
     * @param tableName 表名
     * @param rowkey 行键
     * @param colFamily 列族
     * @param col 列
     * @param value 值
     * @throws IOException 可能出现的异常
     */
    public static void insertData(String tableName,String rowkey,String colFamily,String col,String value) throws IOException {
        Table table = conn.getTable(TableName.valueOf(tableName));
        Put put = new Put(rowkey.getBytes());
        put.addColumn(colFamily.getBytes(),col.getBytes(),value.getBytes());
        table.put(put);
        table.close();
    }

    /**
     * 根据行键删除数据
     * @param tableName 表名
     * @param rowkey 行键
     * @throws IOException 可能出现的异常
     */
    public static void deleteData(String tableName,String rowkey) throws IOException {
        Table table = conn.getTable(TableName.valueOf(tableName));
        Delete delete = new Delete(rowkey.getBytes());
        table.delete(delete);
        table.close();
    }

    /**
     * 获取数据
     * @param tableName 表名
     * @param rowkey 行键
     * @param colFamily 列族
     * @param col 列
     * @throws IOException 可能出现的异常
     */
    public static void getData(String tableName,String rowkey,String colFamily,String col) throws IOException {
        Table table = conn.getTable(TableName.valueOf(tableName));
        Get get = new Get(rowkey.getBytes());
        get.addColumn(colFamily.getBytes(),col.getBytes());
        Result result = table.get(get);
        System.out.println(new String(result.getValue(colFamily.getBytes(),col.getBytes())));
        table.close();
    }

    public static void main(String[] args) throws IOException {
        init();
        createTable("student",new String[]{"score"});
        insertData("student","zhangsan","score","English","69");
        insertData("student","zhangsan","score","Math","86");
        insertData("student","zhangsan","score","Computer","77");
        getData("student","zhangsan","score","Computer");
        close();
    }
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐