某佰的教程太老了,很多都是过时的API,一些方法在eclipse中显示都带有横划线的,看的很脏乱,而且还有印刷错误,故花了几天时间四处搜罗资料把Hbase1.x的API整理了一下 ,本文的java程序全部基于HBase client 1.x以上版本 写了一套example分门别类的列出来给大家分享(带有详细中文注释)
ALTER表相关操作
1. 添加列族
package com.chenjun.hbtest.example.alter;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 使用Java API添加一列族
* 下面给出的是一个完整的程序,用于添加一列族到现有的表。
* @author CJ
*/
public class AddColoumn {
public static void main(String[] args) throws MasterNotRunningException, IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 初始化列描述对象
HColumnDescriptor columnDescriptor = new HColumnDescriptor("contactDetails");
// 添加一个列族
admin.addColumn(TableName.valueOf("employee"), columnDescriptor);
System.out.println("coloumn added");
}
}
2. 删除列族
package com.chenjun.hbtest.example.alter;
import java.io.IOException;
import java.nio.charset.Charset;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* @author CJ
*
* 使用Java API删除列族
* 可以使用HBAseAdmin类的deleteColumn()方法删除列族。按照下面给出的步骤添加一个列族到表中。
*/
public class DeleteColoumn {
public static void main(String[] args) throws MasterNotRunningException, IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 使用deleteColumn()方法delete列族。传递表名和列族名作为这个方法的参数。
admin.deleteColumn(TableName.valueOf("TableName"), "contactDetails".getBytes(Charset.forName("UTF-8")));
System.out.println("列族已删除");
}
}
3. 创建一个表
package com.chenjun.hbtest.example.alter;
import java.io.IOException;
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.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 使用Java API创建一个表
* 可以使用HBaseAdmin类的createTable()方法创建表在HBase中。
* 这个类属于org.apache.hadoop.hbase.client 包。下面给出的步骤是来使用Java API创建表在HBase中。
*
* @author CJ
*/
public class CreateTable {
public static void main(String[] args) throws IOException, ServiceException {
//new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
//初始化表描述
HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf("emp"));
//给表描述对象增加列族
tableDescriptor.addFamily(new HColumnDescriptor("personal"));
tableDescriptor.addFamily(new HColumnDescriptor("professional"));
//让admin根据tableDescriptor执行建表操作
admin.createTable(tableDescriptor);
System.out.println("hbase表创建成功! 表名为emp,列族有personal , professional");
}
}
4. 删除表
package com.chenjun.hbtest.example.alter;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 使用Java API删除表 在删除一个表之前必须先将其禁用。
*
* @author CJ
*/
public class DeleteTable {
public static void main(String[] args) throws IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 禁用
admin.disableTable(TableName.valueOf("emp"));
// 删除
admin.deleteTable(TableName.valueOf("emp12"));
System.out.println("Table deleted");
}
}
增删改查操作
1.全扫描表
package com.chenjun.hbtest.example.crud;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.util.Bytes;
import com.google.protobuf.ServiceException;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
/**
* 使用Java API扫描
* 使用Java API扫描整个表的数据的完整程序如下:
*
* @author CJ
*/
public class FullScanTable {
public static void main(String[] args) throws IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 用表名实例化HTable对象
String tableName = "emp";
TableName tn = TableName.valueOf(tableName);
HTable hTable = null;
if (admin.tableExists(tn)) {
hTable = (HTable) conn.getTable(tn);
} else {
System.err.println("此表不存在");
System.exit(-1);
}
Scan scan = new Scan();
// 扫描需要的列族和列
scan.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"));
scan.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("city"));
// 获取扫描结果
ResultScanner scanner = hTable.getScanner(scan);
// 遍历scan结果
for (Result result = scanner.next(); result != null; result = scanner.next()) {
System.out.println("Found row : " + result);
}
scanner.close();
}
}
2.范围扫描表
package com.chenjun.hbtest.example.crud;
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
import com.google.protobuf.ServiceException;
/**
* 用JAVA API通过行键范围扫描HBase的操作
* @author CJ
*/
public class RangeScanTable {
public static void main(String[] args) throws IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 用表名实例化HTable对象
String tableName = "emp";
TableName tn = TableName.valueOf(tableName);
HTable hTable = null;
if (admin.tableExists(tn)) {
hTable = (HTable) conn.getTable(tn);
} else {
System.err.println("此表不存在");
System.exit(-1);
}
//行键的开始值
String beginRowKey = "1";
//行键的结束值
String endRowKey = "2";
Scan scan = new Scan(Bytes.toBytes(beginRowKey), Bytes.toBytes(endRowKey));
ResultScanner result = hTable.getScanner(scan);
for (Result item : result) {
String rowKey = Bytes.toString(item.getRow());
//参数:列族,列名
List<Cell> cells = item.getColumnCells(Bytes.toBytes("self"), Bytes.toBytes("name"));
//最新的值排在前面,所以取cells的第一个元素
System.out.println("rowKey:"+rowKey+" "+"cell:"+cells.get(0));
}
}
}
3.插入数据
package com.chenjun.hbtest.example.crud;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import com.google.protobuf.ServiceException;
/**
* 使用Java API插入数据
* 可以使用Put 类的add()方法将数据插入到HBase。
* 可以使用HTable类的put()方法保存数据。这些类属于org.apache.hadoop.hbase.client包
*
* @author CJ
*/
public class InsertData {
public static void main(String[] args) throws IOException, ServiceException {
//new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
String tableName = "emp";
TableName tn = TableName.valueOf(tableName);
HTable hTable = null;
if (admin.tableExists(tn)) {
hTable = (HTable) conn.getTable(tn);
} else {
System.err.println("此表不存在");
System.exit(-1);
}
// 用rowKey实例化Put类
Put p = new Put(Bytes.toBytes("row1"));
//参数:列族,列名,列值
p.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"), Bytes.toBytes("raju"));
p.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("city"), Bytes.toBytes("hyderabad"));
p.addColumn(Bytes.toBytes("professional"), Bytes.toBytes("designation"), Bytes.toBytes("manager"));
p.addColumn(Bytes.toBytes("professional"), Bytes.toBytes("salary"), Bytes.toBytes("50000"));
hTable.put(p);
System.out.println("data inserted");
hTable.close();
}
}
4.查询数据
package com.chenjun.hbtest.example.crud;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
import com.google.protobuf.ServiceException;
/**
* 使用Java API读取数据 从一个HBase表中读取数据,要使用HTable类的get()方法。这种方法需要Get类的一个实例
*
* @author CJ
*/
public class ReadData {
public static void main(String[] args) throws IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 用表名实例化HTable对象
String tableName = "emp";
TableName tn = TableName.valueOf(tableName);
HTable hTable = null;
if (admin.tableExists(tn)) {
hTable = (HTable) conn.getTable(tn);
} else {
System.err.println("此表不存在");
System.exit(-1);
}
// 用RowKey实例化Get对象
Get g = new Get(Bytes.toBytes("row1"));
// 读取数据
Result result = hTable.get(g);
// 根据列族和列取出数据
byte[] value = result.getValue(Bytes.toBytes("personal"), Bytes.toBytes("name"));
byte[] value1 = result.getValue(Bytes.toBytes("personal"), Bytes.toBytes("city"));
//byte[]转String
String name = Bytes.toString(value);
String city = Bytes.toString(value1);
//打印输出结果
System.out.println("name: " + name + " city: " + city);
}
}
5.更新数据
package com.chenjun.hbtest.example.crud;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import com.google.protobuf.ServiceException;
/**
* 使用Java API更新数据 使用put()方法将特定单元格更新数据
*
* @author CJ
*/
public class UpdateData {
public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, ServiceException, IOException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
String tableName = "emp";
TableName tn = TableName.valueOf(tableName);
HTable hTable = null;
if (admin.tableExists(tn)) {
hTable = (HTable) conn.getTable(tn);
} else {
System.err.println("此表不存在");
System.exit(-1);
}
// 用rowKey实例化Put对象
Put p = new Put(Bytes.toBytes("row1"));
p.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("city"), Bytes.toBytes("Delih"));
hTable.put(p);
System.out.println("data Updated");
//关闭表
hTable.close();
}
}
6.删除数据
package com.chenjun.hbtest.example.crud;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.util.Bytes;
import com.google.protobuf.ServiceException;
/**
* 使用Java API删除数据 可以从使用HTable类的delete()方法删除HBase表数据
*
* @author CJ
*/
public class DeleteData {
public static void main(String[] args) throws IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 用表名实例化HTable对象
String tableName = "emp";
TableName tn = TableName.valueOf(tableName);
HTable hTable = null;
if (admin.tableExists(tn)) {
hTable = (HTable) conn.getTable(tn);
} else {
System.err.println("此表不存在");
System.exit(-1);
}
// 用rowKey实例化Delete对象
Delete delete = new Delete(Bytes.toBytes("row1"));
//制定要删除的列族和列
delete.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"));
delete.addFamily(Bytes.toBytes("professional"));
// 执行删除
hTable.delete(delete);
// closing the HTable object
hTable.close();
System.out.println("data deleted.....");
}
}
其他操作
1.禁用表
package com.chenjun.hbtest.example.other;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 禁用表使用Java API 要验证一个表是否被禁用,使用isTableDisabled()方法 和disableTable()方法禁用一个表。
* 这些方法属于HBaseAdmin类。
*
* @author CJ
*/
public class DisableTable {
public static void main(String[] args) throws IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 检查表是否禁用。
Boolean bool = admin.isTableDisabled(TableName.valueOf("emp"));
System.out.println(bool);
// 使用HBaseAdmin对象禁用表。
if (!bool) {
admin.disableTable(TableName.valueOf("emp"));
System.out.println("表[emp]已经被禁用");
}
}
}
2.启用表
package com.chenjun.hbtest.example.other;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 使用Java API启用表
* 要验证一个表是否被启用,使用isTableEnabled()方法;并且使用enableTable()方法使一个表启用。
* 这些方法属于HBaseAdmin类。按照下面给出启用表的步骤。
*
* @author CJ
*/
public class EnableTable {
public static void main(String[] args) throws MasterNotRunningException, IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 检查表是否启用。
Boolean bool = admin.isTableEnabled(TableName.valueOf("emp"));
System.out.println(bool);
// Disabling the table using HBaseAdmin object
if (!bool) {
admin.enableTable(TableName.valueOf("emp"));
System.out.println("Table[emp]已经启用");
}
}
}
3.列出所有表
package com.chenjun.hbtest.example.other;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 使用Java API列出表
* 按照下面给出的步骤来使用Java API从HBase获得表的列表。
*
* @author CJ
*/
public class ListTables {
public static void main(String[] args) throws IOException, ServiceException {
//new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
//根据admin获取表描述
HTableDescriptor[] tableDescriptor = admin.listTables();
//打印所有的表名
for (int i = 0; i < tableDescriptor.length; i++) {
System.out.println(tableDescriptor[i].getNameAsString());
}
}
}
4.判断某表是否存在
package com.chenjun.hbtest.example.other;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 使用Java API验证表的存在
* 可以使用HBaseAdmin类的tableExists()方法验证表在HBase中是否存在。按照下面给出的步骤验证HBase表存在。
*
* @author CJ
*/
public class TableExists {
public static void main(String[] args) throws IOException, ServiceException{
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 验证表是否存在
boolean bool = admin.tableExists(TableName.valueOf("emp"));
System.out.println(bool);
}
}
5.关闭HBase服务
package com.chenjun.hbtest.example.other;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import com.google.protobuf.ServiceException;
/**
* 使用Java API停止HBase
* 可以使用HBaseAdmin类的shutdown()方法关闭HBase。按照下面给出关闭HBase的步骤
*
* @author CJ
*/
public class ShutDownHbase {
public static void main(String[] args) throws IOException, ServiceException {
// new一个配置对象
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
HBaseAdmin.checkHBaseAvailable(conf);
Admin admin = conn.getAdmin();
// 停止Hbase
System.out.println("Shutting down hbase");
admin.shutdown();
}
}