HBase 學習筆記 - HBase1.3.1 常用API總結 ⭐️⭐️⭐️

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);

    }
}

⭐️特別注意 :

  1. 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);
    }
}


更新中… ?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章