Java 操作HBase
1.创建一个学生信息表,用来存储学生的姓名(姓名作为行键,且假设姓名不会重复)以及考试成绩,其中考试成绩(score)是一个列族,存储了各个科目的考试成绩。HTableDescriptor包含了HBase中的表格的详细信息(例如表中的列族、表的类型、表是否只读、MemoStore的最大空间、Region分裂时机等)管理HBase数据库信息(包括创建、删除表、列出表项、使表有效/无效、添加/删除表的
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表结构及数据
name score English Math Computer zhangsan 69 86 77
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();
}
}
更多推荐
所有评论(0)