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表结构及数据

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