Somebai's tutorials are too old, many of them are outdated APIs, some methods are displayed with horizontal lines in eclipse, they look messy, and there are printing errors, so it took a few days to search for information. After sorting out the API of Hbase1.x, the java programs in this article are all based on HBase client 1.x and above, and write a set of examples and list them in different categories to share with you (with detailed Chinese comments)
ALTER table related operations
1. Add column family
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. Delete the column family
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. Create a table
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. Delete table
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");
}
}
Add, delete, modify and check operations
1. Full scan table
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. Range scan table
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. Insert data
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. Query data
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. Update data
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. Delete data
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.....");
}
}
other operations
1. Disable the table
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. Enable Table
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. List all tables
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. Determine whether a table exists
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. Shut down the HBase service
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();
}
}