HBase常用API總結
❤️ 使用的HBase版本爲 1.31
1. pom.xml文件:
<!-- 配置 Hbase 的依賴 -->
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 配置hadoop的依賴-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
2.HBUtils
package com.wangt.hbase.utils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* @author 王天賜
* @create 2019-08-01 19:59
*/
public class HBUtils {
// 配置文件對象
private static Configuration conf = null;
// HBase 連接對象
private static Connection connection = null;
// 用於管理HBase 表 .命名空間的對象
private static HBaseAdmin admin = null;
/**
* 獲取 HBase Configuration 對象
*
* @return
*/
public static Configuration getHBaseConfiguration() {
// 創建 HBase 配置文件對象
conf = HBaseConfiguration.create();
// 設置 Hbase 依賴的 Zookeeper ip 以及端口
conf.set("hbase.zookeeper.quorum", "222.22.91.81");
conf.set("hbase.zookeeper.property.clientPort", "2181");
return conf;
}
/**
* 獲取 HBase 連接對象
*
* @return HBase 連接對象
*/
public static Connection getConnection() {
// 獲取 HBase Configuration 對象
conf = getHBaseConfiguration();
try {
// 獲取 HBase 連接對象
connection = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
e.printStackTrace();
}
return connection;
}
/**
* 釋放 Connection 和 HBaseAdmin 連接
*
* @param connection Connection 對象
* @param admin HBaseAdmin 對象
*/
public static void release(Connection connection, Admin admin) {
// 關閉 HBaseAdmin 對象
if (admin != null) {
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 關閉 HBase 連接
if (connection != null) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 將數據封裝進 Put 對象中
*
* @param rowKey rowKey的值
* @param cf 列族名
* @param cn 列名
* @param value 列名對應的參數
* @return 封裝後的 Put 對象
*/
public static Put EncapsulationDataToPutObject(String rowKey, String cf, String cn, String value) {
// 創建 Put 對象
Put put = new Put(Bytes.toBytes(rowKey));
// 添加數據
put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
// 返回 put 對象
return put;
}
}
1.查看錶是否存在
package com.wangt.hbase.common;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import java.io.IOException;
/**
* 判斷表是否存在
* @author 王天賜
* @create 2019-08-01 15:10
*/
public class TableExist {
// 聲明 Hbase 配置文件對象
private static Configuration conf = null;
// 創建 Configuration 對象 並設置 連接zookeeper參數
static {
// 使用 HBaseConfiguration 的單例方法實例化
conf = HBaseConfiguration.create();
// 設置 HBase依賴的 zookeeper ip
conf.set("hbase.zookeeper.quorum", "222.22.91.81");
// 設置 zookeeper 端口
conf.set("hbase.zookeeper.property.clientPort", "2181");
}
/**
* 獲取 HBaseConfiguration 對象
* @return HBaseConfiguration 對象
*/
public static Configuration getHBaseConfiguration(){
return conf;
}
/**
* 獲取 HBaseAdmin 對象
* @return HBaseAdmin 對象
* @Excepation IOException
*/
public static HBaseAdmin getHBaseAdmin() throws IOException {
// 在 Hbase 中 管理 訪問表 需要先創建 HBaseAdmin 表
// 1.獲取 配置文件對象
Configuration conf = getHBaseConfiguration();
// 2.創建 連接對象
Connection connection = ConnectionFactory.createConnection(conf);
// 3.使用 Connection 對象創建 HBaseAdmin
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
return admin;
}
public static void main(String[] args) throws IOException {
String tableName = "dog";
HBaseAdmin admin = getHBaseAdmin();
// 獲取所有的表的信息
TableName[] tableNames = admin.listTableNames();
// 打印所有表名
for (TableName name : tableNames) {
System.out.println(name.getNameAsString());
}
// 判斷某個表是否存在
System.out.println("dog 表是否存在 " + (admin.tableExists("dog") ? "存在" : "不存在"));
if(admin.tableExists("Person")){
System.out.println("Person 表存在");
}else{
System.out.println("Person 表不存在");
}
}
}
2.創建表
package com.wangt.hbase.common;
import com.wangt.hbase.utils.HBUtils;
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 java.io.IOException;
/**
* @author 王天賜
* @create 2019-08-01 16:09
*/
public class CreateTable {
public static void main(String[] args) throws IOException {
// 1.獲取 Hbase 連接對象
Connection connection = HBUtils.getConnection();
// 2.獲取 HBaseAdmin 對象用於管理和訪問表
Admin admin = connection.getAdmin();
// 3.判斷 要創建的表是否存在 (新API)
boolean isExist = admin.tableExists(TableName.valueOf("Person"));
//3.如果表不存在 則創建表
if(!isExist){
// 3.1 創建表屬性對象 直接傳入 String 類型的 table name 的方法已經過時
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("Person"));
// 3.2 創建多個列族
// 1.創建列族名數組
String[] columnFamily = new String[]{"info01" , "info02"};
// 2.向表屬性對象中添加列族
for (String cf : columnFamily) {
// 1.創建列描述對象
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
// 2.將列描述對象添加到表屬性描述對象中
descriptor.addFamily(hColumnDescriptor);
}
// 4.根據對錶的配置創建表
admin.createTable(descriptor);
System.out.println("表 Person 創建成功");
}
// 釋放鏈接
HBUtils.release(connection, admin);
}
}
3.刪除表
package com.wangt.hbase.common;
import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import java.io.IOException;
/**
* 測試 刪除表的操作
* @author 王天賜
* @create 2019-08-02 10:01
*/
public class DeleteTable {
public static void main(String[] args) throws IOException {
// 創建 Admin 對象
Connection connection = HBUtils.getConnection();
Admin admin = connection.getAdmin();
TableName deleteTable = TableName.valueOf("person");
// 判斷 表是否存在
boolean isExist = admin.tableExists(deleteTable);
// 如果 表存在則刪除
if (isExist){
// 將表標記爲刪除狀態
admin.disableTable(deleteTable);
// 刪除表
admin.deleteTable(deleteTable);
System.out.println("表已刪除");
}else {
System.out.println("表不存在 , 無法刪除");
}
}
}
4.添加數據
package com.wangt.hbase.common;
import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 添加表數據
* @author 王天賜
* @create 2019-08-02 10:21
*/
public class PutTableData {
public static void main(String[] args) throws IOException {
// 1.獲取 Hbase 連接對象
Connection connection = HBUtils.getConnection();
// 過時 API
// HTable personTable = new HTable(connection.getConfiguration(), TableName.valueOf("Person"));
// 2.獲取 Table 對象
Table personTable = connection.getTable(TableName.valueOf("Person"));
// 3.創建 Put 對象 添加的數據是 封裝在 put 對象中的
Put put = new Put(Bytes.toBytes("1001"));
// 4.添加數據 對應格式 => 列族 , 列名 , 值
put.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("name"), Bytes.toBytes("李白"));
put.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("age"), Bytes.toBytes("19"));
put.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("sex"), Bytes.toBytes("男"));
// 5.添加數據
personTable.put(put);
System.out.println("添加成功");
// 6.釋放連接
HBUtils.release(connection, null);
}
}
5.批量添加數據
package com.wangt.hbase.common;
import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 批量添加表數據
*
* @author 王天賜
* @create 2019-08-02 10:21
*/
public class PutMultipleTableData {
/**
* 將數據封裝進 Put 對象中
*
* @param rowKey rowKey的值
* @param cf 列族名
* @param cn 列名
* @param value 列名對應的參數
* @return 封裝後的 Put 對象
*/
public static Put EncapsulationDataToPutObject(String rowKey, String cf, String cn, String value) {
// 創建 Put 對象
Put put = new Put(Bytes.toBytes(rowKey));
// 添加數據
put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
// 返回 put 對象
return put;
}
public static void main(String[] args) throws IOException {
// 獲取 Hbase 連接對象
Connection connection = HBUtils.getConnection();
// 獲取 Table 對象
Table personTable = connection.getTable(TableName.valueOf("Person"));
// 用於存放封裝成 Put 對象的list集合
List<Put> puts = new ArrayList<>();
for (int i = 1000 ; i <= 1040 ; i++){
if(puts.size() >= 10){
// 當數據達到10條的時候 將數據寫入表中
personTable.put(puts);
// 清空集合
puts.clear();
}
// 將數據封裝成 put 對象
Put put = EncapsulationDataToPutObject(i + "", "info01", "name", "maomao No." + i);
// 添加進 put 集合
puts.add(put);
}
// 釋放連接
HBUtils.release(connection, null);
}
}
6.刪除數據
package com.wangt.hbase.common;
import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 刪除數據
* @author 王天賜
* @create 2019-08-02 11:08
*/
public class DeleteTableData {
public static void main(String[] args) throws IOException {
// 獲取 數據庫連接
Connection connection = HBUtils.getConnection();
// 獲取 Table 對象
Table personTable = connection.getTable(TableName.valueOf("Person"));
// deleteAll 刪除一個 rowkey中所有的數據
// 封裝 Delete 對象
Delete delete = new Delete(Bytes.toBytes("1001"));
// 注意 : 使用addColumn添加信息刪除數據的時候 只會刪除最新版本的數據 ! 哪怕數據只有一個 版本 也會刪除新的版本的數據 ,
// 數據會退回到上一個版本的數據 一般使用 addColumns 可以把所有版本的數據全部刪除
// 當然也可以使用 addColumn
//delete.addColumn(, , );
delete.addColumns(Bytes.toBytes("info01"), Bytes.toBytes("name"));
// 刪除數據
personTable.delete(delete);
System.out.println("刪除成功....");
// 刪除 指定 Rowkey的全部數據
Delete delete01 = new Delete(Bytes.toBytes("1000"));
// 刪除不存在的數據 不會報錯
personTable.delete(delete01);
System.out.println("刪除成功...");
// 釋放連接
HBUtils.release(connection, null);
}
}
⭐️特別注意 :
- addColumn : 使用addColumn添加信息刪除數據的時候 只會刪除最新版本的數據 ! 哪怕數據只有一個 版本 也會刪除新的版本的數據 ,數據會退回到上一個版本的數據 一般使用 addColumns 可以把所有版本的數據全部刪除 一般需要刪除指定版本的時候 可以使用這個 , 一般刪除都使用 addClumns
7.掃描全表數據
package com.wangt.hbase.common;
import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 全表掃描數據
* @author 王天賜
* @create 2019-08-02 16:14
*/
public class ScanData {
public static void main(String[] args) throws IOException {
// 獲取 Hbase 連接對象
Connection connection = HBUtils.getConnection();
// 獲取 表對象
Table table = connection.getTable(TableName.valueOf("Person"));
// 構建掃描對象
Scan scan = new Scan();
ResultScanner results = table.getScanner(scan);
// 遍歷掃描結果對象
for (Result result : results) {
// 獲取單元格數組
Cell[] cells = result.rawCells();
// 從單元格數組中遍歷得到數據
for (Cell cell : cells) {
// 一般使用 CellUtils 獲取數據
// 獲取 rowKey
String rowKey = Bytes.toString(CellUtil.cloneRow(cell));
// 獲取 列族
String cf = Bytes.toString(CellUtil.cloneFamily(cell));
// 獲取 列名
String cn = Bytes.toString(CellUtil.cloneQualifier(cell));
// 獲取 對應列的值
String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(
"[" + rowKey + "," + cf + "," + cn + "," + value + "]"
);
}
}
// 釋放鏈接
HBUtils.release( connection,null);
}
}
8.獲取指定列數據
package com.wangt.hbase.common;
import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
/**
* 獲取 單行數據
* @author 王天賜
* @create 2019-08-02 16:47
*/
public class GetRowData {
public static void main(String[] args) throws IOException {
// 獲取 Hbase 連接對象
Connection connection = HBUtils.getConnection();
// 獲取 表對象
Table table = connection.getTable(TableName.valueOf("Person"));
// 構建 Get 對象 封裝要獲取的行的信息
Get get = new Get(Bytes.toBytes("1006"));
// 設置 指定的列族 和 列名
//get.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("name"));
Result result = table.get(get);
Cell[] cells = result.rawCells();
// 遍歷數據
// 從單元格數組中遍歷得到數據
for (Cell cell : cells) {
// 一般使用 CellUtils 獲取數據
// 獲取 rowKey
String rowKey = Bytes.toString(CellUtil.cloneRow(cell));
// 獲取 列族
String cf = Bytes.toString(CellUtil.cloneFamily(cell));
// 獲取 列名
String cn = Bytes.toString(CellUtil.cloneQualifier(cell));
// 獲取 對應列的值
String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(
"[" + rowKey + "," + cf + "," + cn + "," + value + "]"
);
}
table.close();
// 釋放鏈接
HBUtils.release( connection,null);
}
}