HbaseAPI工具类的创建
知识梳理
1. 表的管理
-
HBaseAdmin
- 管理表(创建/删除)
-
HTableDescriptor
- 表描述器,用来创建表
-
HcolumnDescriptor
- 列描述器,用来构建列族
2. 表中数据操作
-
Table
- 用来表中数据的操作(添加数据/删除数据)
-
Put
- 用来封装待添加的数据
-
Delete
- 用来存放待删除的数据
3. 表中数据的获取
-
Scan
- 用于设置扫描表的配置信息,默认全部扫描
-
ResultScanner
- 通过配置的扫描器,得到一个扫描表的实例扫描器
-
Result
- 每一个该类的实例化对象,都对应一个rowkey中若干数据,可直接通过Result得到rowkey
-
Cell
-
封装一个row key下所有的单元格中的数据
-
包括rowKey;columnFamily;column;vlue
-
-
Get
- 用于得到某一具体列数据
工具类创建HBaseUtil
public class HBaseUtil {
private static Configuration conf;
private static Logger logger= Logger.getLogger(HBaseUtil.class);
static {
conf = HBaseConfiguration.create();
conf.set("hbase.rootdir", "hdfs://master:9000/hbase");
conf.set("hbase.zookeeper.quorum","master:2181,slave1:2181,slave2:2181");
}
/**
* 判断表是否存在
* 用到
* HBaseAdmin
* admin.tableExists(TableName.valueOf(tableName));
*
* @author anna
* @throws IOException
* @throws ZooKeeperConnectionException
* @throws MasterNotRunningException
*/
public static boolean isExist(String tableName) throws IOException{
logger.info("正在调用isExist()方法,判断" + tableName + "是否存在");
//老API
// HBaseAdmin admin = new HBaseAdmin(conf);
//新API
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
Admin admin = connection.getAdmin();
return admin.tableExists(TableName.valueOf(tableName));
//Bytes.toBytes(tableName);——此方法在Admin中没有
}
/**
* Hbase表的创建
* 用到
* HBaseAdmin 用于管理表——创建表 admin.createTable(HTableDescriptor)
* HTableDescriptor 用于描述表 参数为TableName.valueOf(tableName)
* HColumnDescriptor 用于描述列族 参数为String
*
* @author anna
*/
public static void createTable(String tableName,String... columnFamily) throws Exception {
logger.info("正在调用createTable()方法创建表"+ tableName);
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
Admin admin = connection.getAdmin();
//判断表是否存在
if(isExist(tableName)) {
throw new Exception("表已存在,不可重复创建");
}else{
//创建表描述器
HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
for (String family : columnFamily) {
desc.addFamily(new HColumnDescriptor(family));
}
//创建表
admin.createTable(desc);
logger.info(tableName + "表成功创建");
}
}
/**
* 批量创建表
*
* 此时用Map集合来封装表名称和列族
* HashMap<String,String[]> key为tableName,value为String[]数组的columnFamily
* @throws Exception
*/
public static void createMultiTables(Map<String,String[]> map) throws Exception {
logger.info("正在调用createMultiTable()创建表");
for (Entry<String, String[]> entry : map.entrySet()) {
//1. 获取tableName和columnFamily
//1.1 获取tableName
String tableName = entry.getKey();
//1.2 获取columnFamily
String[] columnFamily = entry.getValue();
//创建表
createTable(tableName, columnFamily);
}
}
/**
* Hbase表的删除
* HBaseAdmin 用于管理表——删除表 admin.deleteTable(TableName.valueOf(tableName))
*
* 删除表前判断表是否disabled
* admin.isTableDisabled(TableName.valueOf(tableName)
*
* @author anna
* @throws Exception
*/
public static void deleteTable(String tableName) throws Exception {
logger.info("正在调用deleteTable删除表" + tableName);
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
Admin admin = connection.getAdmin();
if(isExist(tableName)) {
if(!admin.isTableDisabled(TableName.valueOf(tableName))) {
//disable
admin.disableTable(TableName.valueOf(tableName));
}
//删除表
admin.deleteTable(TableName.valueOf(tableName));
logger.info(tableName + "表删除成功=======");
}else {
throw new Exception(tableName + "表不存在,无法进行删除");
}
}
/**
* 批量删除表
* List<String>中封装tableName集合
* @throws Exception
*/
public static void deleteMultiTables(List<String> list) throws Exception {
for (String tableName : list) {
deleteTable(tableName);
}
}
/**
* 向Hbase中添加一行数据
* 1. 获取表
* connection.getTable(TableName.valueOf(tableName));
*
* 2. 用到Table进行表中数据的操作
* table.put(put);
*
* 3. Put用来封装待存放的数据
* new Put(Bytes.toBytes(rowKey))
* addColumn(columnFamily,column,value);
*
*
* @author anna
* @throws IOException
*/
public static void addRow(String tableName,String rowKey,String columnFamily,String column,String value) throws IOException {
logger.info("正在调用addRow方法,向" + tableName + "表中添加数据");
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
//获取表
Table table = connection.getTable(TableName.valueOf(tableName));
//封装待存放的对象
Put put = new Put(Bytes.toBytes(rowKey)); //rowkey封装
put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value)); //指定列族,列名,存放的数据
//添加数据
table.put(put); //可以传入Put对象的集合
}
/**
* 删除单行数据
* @throws IOException
*/
public static void deleteMultiRow(String tableName,String rowKey) throws IOException {
logger.info("正在调用deleteMultiRow方法,删除" + tableName + "表中rowKey为"+ rowKey + "的数据");
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
Table table = connection.getTable(TableName.valueOf(tableName)); //获取表
Delete delete = new Delete(Bytes.toBytes(rowKey));
table.delete(delete);
}
/**
* 删除多行数据
* @throws IOException
*/
public static void deleteMultiRow(String tableName,List<String> rowKeys) throws IOException {
logger.info("正在调用deleteMultiRow方法,删除" + tableName + "表中"+ "多行数据");
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
//获取表
Table table = connection.getTable(TableName.valueOf(tableName));
//批量删除
List<Delete> list = new ArrayList<>();
for (String rowKey : rowKeys) {
Delete delete = new Delete(Bytes.toBytes(rowKey));
list.add(delete);
}
//批量删除多行
table.delete(list); //批处理效率更高
}
/**
* 扫描数据——得到所有数据
* 仍旧是对表中数据的操作,还是Table对象
*
* —— 设置扫描表的配置信息 Scan
* 默认全部扫描
*
* ResultScanner:通过配置的扫描器,得到一个扫描表的实例扫描器
*
* Result: 每一个该类的实例化对象,都对应一个rowKey中的若干数据
* 可直接得到row key
*
* Cell: 封装一个row Key下所有单元格中的数据(rowKey,columnFamily,Column,value)
* @throws IOException
*/
public static void getAllRows(String tableName) throws IOException {
logger.info("正在调用getAllRows方法,扫描表" + tableName );
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
//获取表
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan(); //扫描表的配置信息
// scan.setMaxVersions();
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
// System.out.println(Bytes.toString(result.getRow())); 也可以获取到row key
Cell[] rawCells = result.rawCells(); //获取所有的cell
for (Cell cell : rawCells) {
System.out.println("行健:" + Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("行健:" + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("行健:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("行健:" + Bytes.toString(CellUtil.cloneValue(cell)));
System.out.println("------------------");
}
}
}
/**
* 得到指定列数据
*/
public static void getRow(String tableName,String rowKey,String columnFalily,String column) throws IOException {
logger.info("正在调用getRow方法,获取表" + tableName + "中,rowKey为" + rowKey + "的数据");
Connection connection = ConnectionFactory.createConnection(conf); //工厂设计模式
//获取表
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(columnFalily),Bytes.toBytes(column)); //设置要获取的列族和列
Result result = table.get(get);
Cell[] rawCells = result.rawCells(); //获取所有的cell
for (Cell cell : rawCells) {
System.out.println("行健:" + Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("行健:" + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("行健:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("行健:" + Bytes.toString(CellUtil.cloneValue(cell)));
System.out.println("------------------");
}
}
}
网友评论