几个主要 Hbase API 类和数据模型之间的对应关系:
java类 | HBase 数据模型 |
---|---|
Admin | 数据库(DataBase) |
HBaseConfiguration | |
Table | 表(Table) |
HTableDescriptor | 列簇(Column Family) |
HColumnDescriptor | |
Put | 列修饰符(Column Qualifier) |
Get | |
Delete | |
Result | |
Scan | |
ResultScanner |
基本增删除改查demo
package com.study.follow.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* @author: honey
* @date: 2020/2/8
*/
public class HbaseDemoTest {
static Configuration conf;
static Connection connection;
static Admin admin;
public static final String ZK_CONNECT_STR="10.211.55.20:2181,10.211.55.21:2181,10.211.55.22:2181";
static {
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum",ZK_CONNECT_STR);
try {
connection = ConnectionFactory.createConnection(conf);
admin = connection.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建表
* @param tableName 表名
* @param family 列簇
* @throws IOException
*/
private static void createTable(String tableName,String[] family) throws IOException {
TableName table= TableName.valueOf(tableName);
if(admin.tableExists(table)){
System.out.println("table exists:【"+tableName+"】");
}else {
HTableDescriptor htableDesc = new HTableDescriptor(table);
for (int i = 0; i < family.length; i++) {
htableDesc.addFamily(new HColumnDescriptor(family[i]));
}
admin.createTable(htableDesc);
System.out.println("create table success");
}
}
/**
* 为表添加数据(适合知道有多少列簇的固定表)
*
* @param tableName
* @param rowKey
* @param column1 第一个列簇列表
* @param value1 第一个列的值列表
* @param column2 第二个列簇列表
* @param value2 第二个列的值列表
*/
private static void addData(String tableName, String rowKey, String[] column1, String[] value1, String[] column2, String[] value2) throws IOException {
// 设置rowkey
Put put = new Put(Bytes.toBytes(rowKey));
//Table 负责跟记录(表数据)相关的操作,如增删改查等
TableName tableName1 = TableName.valueOf(tableName);
Table table = connection.getTable(tableName1);
//获取所有列簇
HColumnDescriptor[] columnFamilies = table.getTableDescriptor().getColumnFamilies();
for (int i = 0; i < columnFamilies.length ; i++) {
//获取列簇名
String familyName = columnFamilies[i].getNameAsString();
if(familyName.equals("base_info")){
for (int j = 0; j < column1.length ; j++) {
put.addImmutable(Bytes.toBytes(familyName),Bytes.toBytes(column1[i]), Bytes.toBytes(value1[i]));
}
}
if(familyName.equals("extra_info")){
for (int j = 0; j < column2.length ; j++) {
put.addImmutable(Bytes.toBytes(familyName),Bytes.toBytes(column2[i]), Bytes.toBytes(value2[i]));
}
}
}
table.put(put);
System.out.println("add data success!");
}
/**
* 根据 rowkey 查询
* @param tableName
* @param rowkey
* @return
* @throws IOException
*/
private static Result getResult(String tableName,String rowkey) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowkey));
Result result = table.get(get);
for (Cell cell: result.listCells()){
printKeyValue(cell);
}
return result;
}
public static void printKeyValue(Cell cell){
System.out.println("rowkey:" + Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("family:" + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("qualifier:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("value:" + Bytes.toString(CellUtil.cloneValue(cell)));
System.out.println("Timestamp:" + cell.getTimestamp());
System.out.println("-------------------------------------------");
}
/**
* 遍历查询hbase表
* @param tableName
* @throws IOException
*/
public static void getResultScanner(String tableName) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
ResultScanner resultScanner = null;
try {
resultScanner = table.getScanner(scan);
for (Result r : resultScanner){
for (Cell cell : r.listCells()){
printKeyValue(cell);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
resultScanner.close();
}
}
/**
* 指定范围遍历查询hbase表,注意:包括下界,不包括上界
* @param tableName
* @param start_rowkey
* @param stop_rowkey
* @throws IOException
*/
public static void getResultScan(String tableName, String start_rowkey,String stop_rowkey) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes(start_rowkey));
scan.withStopRow(Bytes.toBytes(stop_rowkey));
ResultScanner resultScanner = null;
try {
resultScanner = table.getScanner(scan);
printResultScanner(resultScanner);
} catch (IOException e) {
e.printStackTrace();
}finally {
resultScanner.close();
}
}
private static void printResultScanner(ResultScanner resultScanner) {
for (Result result:resultScanner){
for (Cell cell:result.listCells()){
printKeyValue(cell);
}
}
}
/**
* 查询表中的某一列
* @param tableName
* @param rowkey
* @param familyName
* @param columnName
* @throws IOException
*/
public static void getResultByColumn(String tableName,String rowkey,String familyName, String columnName) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowkey));
get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
Result result = table.get(get);
for (Cell cell:result.listCells()){
printKeyValue(cell);
}
}
/**
* 更新表中的某一列
* @param tableName
* @param rowkey
* @param familyName
* @param columnName
* @param value
*/
public static void updateTable(String tableName, String rowkey,String familyName,String columnName,String value) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(Bytes.toBytes(rowkey));
put.addImmutable(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
table.put(put);
System.out.println("update table success");
}
/**
* 查询某列数据的多个版本
* @param tableName
* @param rowkey
* @param familyName
* @param columnName
*/
public static void getResultByVersion(String tableName,String rowkey,String familyName,String columnName) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowkey));
get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
get.setMaxVersions(3);
Result result = table.get(get);
for (Cell cell:result.listCells()){
printKeyValue(cell);
}
}
/**
* 删除指定的列
* @param tableName
* @param rowkey
* @param familyName
* @param columnName
*/
public static void deleteColumn(String tableName,String rowkey, String familyName,String columnName) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(Bytes.toBytes(rowkey));
delete.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
table.delete(delete);
System.out.println(familyName + ":" + columnName + "is deleted");
}
/**
* 删除指定行的所有列
* @param tableName
* @param rowkey
*/
public static void deleteAllColumn(String tableName,String rowkey) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(Bytes.toBytes(rowkey));
table.delete(delete);
System.out.println("all columns of "+rowkey+" are deleted");
}
/**
* 删除表
* @param tableName
* @throws IOException
*/
public static void deleteTable(String tableName) throws IOException {
TableName tableName1 = TableName.valueOf(tableName);
admin.disableTable(tableName1);
admin.deleteTable(tableName1);
System.out.println(tableName + "is deleted!");
}
public static void main(String[] args) throws IOException {
String tableName="test";
String[] family = {"base_info","extra_info"};
// 1. create table
// HbaseDemoTest.createTable(tableName,family);
// 2. add data
// String[] column1={"name","age"};
// String[] value1={"ZhangSan","18"};
//
// String[] column2={"Hobbies","Country"};
// String[] value2={"basketball","China"};
// HbaseDemoTest.addData(tableName,"rk0001",column1,value1,column2,value2);
// HbaseDemoTest.addData(tableName,"rk0002",column1,value1,column2,value2);
// 3. 根据rolwkey查询
// HbaseDemoTest.getResult(tableName,"rk0001");
// 4.遍历查询 hbase 表
// HbaseDemoTest.getResultScanner(tableName);
// 5. 指定范围遍历查询hbase表,注意:包括下界,不包括上界
// HbaseDemoTest.getResultScan(tableName,"rk0001","rk0002");
// 6. 查询表中的某一列
// HbaseDemoTest.getResultByColumn(tableName,"rk0002","base_info","name");
// 7. 更新表中的某一列
// HbaseDemoTest.updateTable(tableName,"rk0002","base_info","name","LiSi");
// 8. 查询某列数据的多个版本
// HbaseDemoTest.getResultByVersion(tableName,"rk0002","base_info","name");
// 9. 删除指定列
// HbaseDemoTest.deleteColumn(tableName,"rk0001","extra_info","Hobbies");
// 10. 删除指定行的所有列
// HbaseDemoTest.deleteAllColumn(tableName,"rk0001");
// 11. 删除表
// HbaseDemoTest.deleteTable(tableName);
}
}
来源:CSDN
作者:霁泽Coding
链接:https://blog.csdn.net/jiajane/article/details/104282836