Hbase java API 调用
一. hbase的安装
参考:http://blog.csdn.net/mapengbo521521/article/details/41777721
二.hbase访问方式
Native java api:最常规最高效的访问方式。
Hbase shell:hbase的命令行工具,最简单的接口,适合管理员使用
Thrift gateway:利用thrift序列化结束支持各种语言,适合异构系统在线访问
Rest gateway:支持rest风格的http api访问hbase,解除异构系统语言限制。
Mapreduce:直接使用mr作业处理Hbase数据。使用hive、pig处理hbase数据。
三.java api访问Hbase的步骤
1. 创建configuration对象,包含各种配置信息。
Configuration conf=HbaseConfiguration.create();
2. 构建HTabele句柄,需要提供configuration对象和table名称。
HTable table=new HTable(conf,tableName);
3. 指向相应的操作:put,get,delete,scan等操作.
Table.getTableName();
4. 关闭HTable句柄
Table.close();
四.JAVA常用api
1、 对表的创建、删除、显示以及修改等,可以用HBaseAdmin,一旦创建了表,那么可以通过HTable的实例来访问表,每次可以往表里增加数据。
2、 插入数据创建一个Put对象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。
3、 获取数据,使用Get对象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来调用。
4、 浏览每一行,通过Scan可以对表中的行进行浏览,得到每一行的信息,比如列名,时间戳等,Scan相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan)来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan)都是返回一个Result。Result是一个
KeyValue的链表。
5、 删除
使用Delete来删除记录,通过调用HTable.delete(Delete)来执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)
6、 新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。
7、 簇的访问,客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeperquorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase-site.xml。
五.Java demo
packageorg.apache.hadoop.hbase;
importjava.io.IOException;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.hbase.client.Delete;
importorg.apache.hadoop.hbase.client.Get;
importorg.apache.hadoop.hbase.client.HBaseAdmin;
importorg.apache.hadoop.hbase.client.HTable;
importorg.apache.hadoop.hbase.client.Put;
importorg.apache.hadoop.hbase.client.Result;
importorg.apache.hadoop.hbase.client.ResultScanner;
importorg.apache.hadoop.hbase.client.Scan;
importorg.apache.hadoop.hbase.util.Bytes;
publicclass Hbase {
// 声明静态配置
static Configuration conf = null;
static {
conf =HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","localhost");
}
/*
* 创建表
*
* @tableName 表名
*
* @family 列族列表
*/
public static void creatTable(StringtableName, String[] family)
throws Exception {
HBaseAdmin admin = newHBaseAdmin(conf);
HTableDescriptor desc = newHTableDescriptor(tableName);
for (int i = 0; i <family.length; i++) {
desc.addFamily(newHColumnDescriptor(family[i]));
}
if(admin.tableExists(tableName)) {
System.out.println("tableExists!");
System.exit(0);
} else {
admin.createTable(desc);
System.out.println("createtable Success!");
}
}
/*
* 为表添加数据(适合知道有多少列族的固定表)
*
* @rowKey rowKey
*
* @tableName 表名
*
* @column1 第一个列族列表
*
* @value1 第一个列的值的列表
*
* @column2 第二个列族列表
*
* @value2 第二个列的值的列表
*/
public static void addData(StringrowKey, String tableName,
String[] column1,String[] value1, String[] column2, String[] value2)
throws IOException {
Put put = newPut(Bytes.toBytes(rowKey));//设置rowkey
HTable table = newHTable(conf, Bytes.toBytes(tableName));// HTabel负责跟记录相关的操作如增删改查等//
// 获取表
HColumnDescriptor[]columnFamilies = table.getTableDescriptor() //获取所有的列族
.getColumnFamilies();
for (int i = 0; i <columnFamilies.length; i++) {
String familyName =columnFamilies[i].getNameAsString(); //获取列族名
if(familyName.equals("article")) { // article列族put数据
for (int j= 0; j < column1.length; j++) {
put.add(Bytes.toBytes(familyName),Bytes
.toBytes(column1[j]),Bytes.toBytes(value1[j]));
}
}
if(familyName.equals("author")) { // author列族put数据
for (int j= 0; j < column2.length; j++) {
put.add(Bytes.toBytes(familyName),Bytes
.toBytes(column2[j]),Bytes.toBytes(value2[j]));
}
}
}
table.put(put);
System.out.println("adddata Success!");
}
/*
* 根据rwokey查询
*
* @rowKey rowKey
*
* @tableName 表名
*/
public static Result getResult(StringtableName, String rowKey)
throws IOException {
Get get = newGet(Bytes.toBytes(rowKey));
HTable table = newHTable(conf, Bytes.toBytes(tableName));//获取表
Result result =table.get(get);
for (KeyValue kv :result.list()) {
System.out.println("family:"+ Bytes.toString(kv.getFamily()));
System.out
.println("qualifier:"+ Bytes.toString(kv.getQualifier()));
System.out.println("value:"+ Bytes.toString(kv.getValue()));
System.out.println("Timestamp:"+ kv.getTimestamp());
System.out.println("-------------------------------------------");
}
return result;
}
/*
* 遍历查询hbase表
*
* @tableName 表名
*/
public static void getResultScann(StringtableName) throws IOException {
Scan scan = new Scan();
ResultScanner rs = null;
HTable table = newHTable(conf, Bytes.toBytes(tableName));
try {
rs =table.getScanner(scan);
for (Result r : rs){
for(KeyValue kv : r.list()) {
System.out.println("row:"+ Bytes.toString(kv.getRow()));
System.out.println("family:"
+Bytes.toString(kv.getFamily()));
System.out.println("qualifier:"
+Bytes.toString(kv.getQualifier()));
System.out
.println("value:"+ Bytes.toString(kv.getValue()));
System.out.println("timestamp:"+ kv.getTimestamp());
System.out
.println("-------------------------------------------");
}
}
} finally {
rs.close();
}
}
/*
* 遍历查询hbase表
*
* @tableName 表名
*/
public static voidgetResultScann(String tableName, String start_rowkey,
String stop_rowkey)throws IOException {
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes(start_rowkey));
scan.setStopRow(Bytes.toBytes(stop_rowkey));
ResultScanner rs = null;
HTable table = newHTable(conf, Bytes.toBytes(tableName));
try {
rs =table.getScanner(scan);
for (Result r : rs){
for(KeyValue kv : r.list()) {
System.out.println("row:"+ Bytes.toString(kv.getRow()));
System.out.println("family:"
+Bytes.toString(kv.getFamily()));
System.out.println("qualifier:"
+Bytes.toString(kv.getQualifier()));
System.out
.println("value:"+ Bytes.toString(kv.getValue()));
System.out.println("timestamp:"+ kv.getTimestamp());
System.out
.println("-------------------------------------------");
}
}
} finally {
rs.close();
}
}
/*
* 查询表中的某一列
*
* @tableName 表名
*
* @rowKey rowKey
*/
public static voidgetResultByColumn(String tableName, String rowKey,
String familyName,String columnName) throws IOException {
HTable table = newHTable(conf, Bytes.toBytes(tableName));
Get get = newGet(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(columnName)); //获取指定列族和列修饰符对应的列
Result result =table.get(get);
for (KeyValue kv :result.list()) {
System.out.println("family:"+ Bytes.toString(kv.getFamily()));
System.out
.println("qualifier:"+ Bytes.toString(kv.getQualifier()));
System.out.println("value:"+ Bytes.toString(kv.getValue()));
System.out.println("Timestamp:"+ kv.getTimestamp());
System.out.println("-------------------------------------------");
}
}
/*
* 更新表中的某一列
*
* @tableName 表名
*
* @rowKey rowKey
*
* @familyName 列族名
*
* @columnName 列名
*
* @value 更新后的值
*/
public static void updateTable(StringtableName, String rowKey,
String familyName,String columnName, String value)
throws IOException {
HTable table = newHTable(conf, Bytes.toBytes(tableName));
Put put = newPut(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(familyName),Bytes.toBytes(columnName), Bytes
.toBytes(value));
table.put(put);
System.out.println("updatetable Success!");
}
/*
* 查询某列数据的多个版本
*
* @tableName 表名
*
* @rowKey rowKey
*
* @familyName 列族名
*
* @columnName 列名
*/
public static voidgetResultByVersion(String tableName, String rowKey,
String familyName,String columnName) throws IOException {
HTable table = newHTable(conf, Bytes.toBytes(tableName));
Get get = newGet(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(columnName));
get.setMaxVersions(5);
Result result =table.get(get);
for (KeyValue kv :result.list()) {
System.out.println("family:"+ Bytes.toString(kv.getFamily()));
System.out
.println("qualifier:"+ Bytes.toString(kv.getQualifier()));
System.out.println("value:"+ Bytes.toString(kv.getValue()));
System.out.println("Timestamp:"+ kv.getTimestamp());
System.out.println("-------------------------------------------");
}
/*
* List<?> results =table.get(get).list(); Iterator<?> it =
* results.iterator(); while (it.hasNext()) {
* System.out.println(it.next().toString()); }
*/
}
/*
* 删除指定的列
*
* @tableName 表名
*
* @rowKey rowKey
*
* @familyName 列族名
*
* @columnName 列名
*/
public static void deleteColumn(StringtableName, String rowKey,
String falilyName,String columnName) throws IOException {
HTable table = newHTable(conf, Bytes.toBytes(tableName));
Delete deleteColumn = newDelete(Bytes.toBytes(rowKey));
deleteColumn.deleteColumns(Bytes.toBytes(falilyName),Bytes
.toBytes(columnName));
table.delete(deleteColumn);
System.out.println(falilyName+ ":" + columnName + "is deleted!");
}
/*
* 删除指定的列
*
* @tableName 表名
*
* @rowKey rowKey
*/
public static voiddeleteAllColumn(String tableName, String rowKey)
throws IOException {
HTable table = newHTable(conf, Bytes.toBytes(tableName));
Delete deleteAll = newDelete(Bytes.toBytes(rowKey));
table.delete(deleteAll);
System.out.println("allcolumns are deleted!");
}
/*
* 删除表
*
* @tableName 表名
*/
public static void deleteTable(StringtableName) throws IOException {
HBaseAdmin admin = newHBaseAdmin(conf);
admin.disableTable(tableName);
admin.deleteTable(tableName);
System.out.println(tableName+ "is deleted!");
}
public static void main(String[] args)throws Exception {
// 创建表
String tableName ="blog2";
String[] family = {"article", "author" };
creatTable(tableName, family);
// 为表添加数据
String[] column1 = {"title", "content", "tag" };
String[] value1 = {
"HeadFirst HBase",
"HBaseis the Hadoop database. Use it when you need random, realtime read/write accessto your Big Data.",
"Hadoop,HBase,NoSQL"};
String[] column2 = {"name", "nickname" };
String[] value2 = {"nicholas", "lee" };
addData("rowkey1","blog2", column1, value1, column2, value2);
addData("rowkey2","blog2", column1, value1, column2, value2);
addData("rowkey3","blog2", column1, value1, column2, value2);
// 遍历查询
getResultScann("blog2","rowkey4", "rowkey5");
// 根据row key范围遍历查询
getResultScann("blog2","rowkey4", "rowkey5");
// 查询
getResult("blog2","rowkey1");
// 查询某一列的值
getResultByColumn("blog2","rowkey1", "author", "name");
// 更新列
updateTable("blog2","rowkey1", "author", "name", "bin");
// 查询某一列的值
getResultByColumn("blog2","rowkey1", "author", "name");
// 查询某列的多版本
getResultByVersion("blog2","rowkey1", "author", "name");
// 删除一列
deleteColumn("blog2","rowkey1", "author", "nickname");
// 删除所有列
deleteAllColumn("blog2","rowkey1");
// 删除表
deleteTable("blog2");
}
}