大數據組件-hbase簡介架構,hbase集羣搭建,高可用配置,表模型,hbase shell操作,javaAPI操作,創建表,向表添加數據,查詢數據,過濾器查詢,刪除表

環境統一:
zk:
hadoop:2.7.5
HBase:2.0.0
ssh軟件:Bitvise

1.Hbase簡介

hbase依賴於hdfs,非關係型數據庫
是一種稀疏表結構(稀疏表就是空行並不佔用磁盤空間)
hbase當中所有數據都是byte[]類型
在這裏插入圖片描述

(1)Hbase的數據存儲架構

  • 主節點:HMster
    1. 監控regionServer健康狀態
    2. 處理regionServer故障轉移
    3. 處理元數據變更
    4. 處理region的分配或者移除
    5. 空閒時間做負載均衡
  • 從節點:HRegionServer
    1. 負責存儲HBase的實際數據
    2. 處理分配給他的region
    3. 刷新緩存的數據到HDFS上去
    4. 維護HLog
    5. 執行數據的壓縮
    6. 負責處理region分片

一個HRegionServer = 1個HLog+很多個region
1個region=很多個store模塊組成
1個store模塊 = 1個memoryStore+很多storeFile

(2)HLog模塊的使用場景

HLog是爲了解決數據丟失問題,HBase在讀寫時,不是直接存儲磁盤,中間會有停留內存的一個時間段,在內存中可能發生斷電丟失等等數據丟失問題,所以設置一個HLog模塊,將數據寫入文件中,在通過文件寫入內存,在通過內存寫入磁盤.當內存到磁盤過程出現問題導致數據丟失時,可以使用HLog文件對數據重建.

2.HBase集羣搭建

注意事項:HBase是依賴於HDFS的所以在安裝前一定要保證hadoop和zk啓動

(1)下載上傳解壓

HBse下載地址

通過ssh上傳至node01節點下/export/software
在這裏插入圖片描述

//解壓
 tar -zxvf hbase-2.0.0-bin.tar.gz -C /export/servers/

(2)修改配置文件

使用Notepad++連接node01節點進行配置文件修改

1.hbase-env.sh

export JAVA_HOME=/export/servers/jdk1.8.0_141
export HBASE_MANAGES_ZK=false

2.hbase-site.xml

<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://node01:8020/hbase</value>  
        </property>
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>

   <!-- 0.98後的新變動,之前版本沒有.port,默認端口爲60000 -->
        <property>
                <name>hbase.master.port</name>
                <value>16000</value>
        </property>

        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>node01:2181,node02:2181,node03:2181</value>
        </property>

        <property>
                <name>hbase.zookeeper.property.dataDir</name>
         <value>/export/servers/zookeeper-3.4.9/zkdatas</value>
        </property>
</configuration>

3.regionservers

node01
node02
node03

4.創建back-masters配置文件,實現HMaster的高可用

cd /export/servers/hbase-2.0.0/conf
vim backup-masters
node02

5.安裝包分發到其他機器

cd /export/servers/
scp -r hbase-2.0.0/ node02:$PWD
scp -r hbase-2.0.0/ node03:$PWD

6.三臺機器創建軟連接

因爲hbase需要讀取hadoop的core-site.xml以及hdfs-site.xml當中的配置文件信息,所以我們三臺機器都要執行以下命令創建軟連接

ln -s /export/servers/hadoop-2.7.5/etc/hadoop/core-site.xml /export/servers/hbase-2.0.0/conf/core-site.xml
ln -s /export/servers/hadoop-2.7.5/etc/hadoop/hdfs-site.xml /export/servers/hbase-2.0.0/conf/hdfs-site.xml

7.三臺機器添加HBASE_HOME的環境變量

vim /etc/profile
export HBASE_HOME=/export/servers/hbase-2.0.0
export PATH=:$HBASE_HOME/bin:$PATH

8.HBase集羣啓動

cd /export/servers/hbase-2.0.0
bin/start-hbase.sh

9.頁面訪問

瀏覽器頁面訪問地址:
http://node01:16010/master-status
在這裏插入圖片描述

3.Hbase表模型

在這裏插入圖片描述rowKey:行鍵.每一行數據都是使用行鍵進行標識的
columnFamily:列族,列族下面可以有多列
column:列的概念,每一個列都必須歸屬於某一個列族
timestamp:時間戳,每條數據都會有時間戳的概念
versionNum:版本號,每條數據都會有版本號,每次數據變化,版本號都會進行更新

創建一張HBase表最少需要兩個條件:表名+列族名
注意:rowkey是我們在插入數據的時候自己指定的,列名 也是在我們插入數據的時候動態指定的,時間戳是插入數據的時候,系統自動幫我們生成的,versionNum是系統自動維護的

4.HBase的Shell客戶端操作

(1)進入HBase客戶端命令操作界面

cd /export/servers/hbase-2.0.0
bin/hbase shell

(2)查看當前數據庫中有哪些表

list

在這裏插入圖片描述

(3)創建一張表

創建user表,包含info、data兩個列族

create 'user', 'info', 'data'

(4)向表中添加數據

向user表中插入信息,row key爲rk0001,列族info中添加name列標示符,值爲zhangsan

 put 'user', 'rk0001', 'info:name', 'zhangsan'

(5)查看錶中數據

scan "user"

在這裏插入圖片描述

(6)數據查詢

1.通過rowkey進行查詢

  • 獲取user表中row key爲rk0001的所有信息
get 'user', 'rk0001'

2.查看rowkey下面的某個列族的信息

  • 獲取user表中row key爲rk0001,info列族的所有信息
get 'user', 'rk0001', 'info'

3.查看rowkey指定列族指定字段的值

  • 獲取user表中row key爲rk0001,info列族的name、age列標示符的信息
get 'user', 'rk0001', 'info:name', 'info:age'

4.查看rowkey指定多個列族的信息

get 'user', 'rk0001', 'info', 'data'

5.指定rowkey與列值查詢

get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}  //ValueFilter值過濾器,過濾出二進制(binary)結果值等於的張三

6.指定rowkey與列值模糊查詢

獲取user表中row key爲rk0001,列標示符中含有a的信息

get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} //QualifierFilter列過濾器,過濾出列名包含a的

7.查詢所有數據

查詢user表中的所有信息

scan 'user'

8.列族查詢

查詢user表中列族爲info的信息

scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}

9.多列族查詢

查詢user表中列族爲info和data的信息

scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}

10.指定列族與某個列名查詢

查詢user表中列族爲info、列標示符爲name的信息

scan 'user', {COLUMNS => 'info:name'}

15.指定範圍值查詢

查詢user表中指定範圍的數據

scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

(7)更新數據操作

1.更新數據值

更新操作同插入操作一模一樣,只不過有數據就更新,沒數據就添加

2.更新版本號

將user表的info列族版本號改爲5

alter 'user', NAME => 'info', VERSIONS => 5

3.

(8)刪除數據以及刪除表操作

1.指定rowkey以及列名進行刪除

刪除user表row key爲rk0001,列標示符爲info:name的數據

delete 'user', 'rk0001', 'info:name'

(9)HBase的高級shell管理命令

1.status

例如:顯示服務器狀態
hbase(main):058:0> status ‘node01’

2.whoami

顯示HBase當前用戶,例如:
hbase> whoami

3.list

顯示當前所有的表

4.count

統計指定表的記錄數,例如:
hbase> count ‘user’

5.describe

展示表結構信息

6.exists

檢查表是否存在,適用於表量特別多的情況

7.is_enabled、is_disabled

檢查表是否啓用或禁用

8.alter

該命令可以改變表和列族的模式,例如:
爲當前表增加列族:
hbase> alter ‘user’, NAME => ‘CF2’, VERSIONS => 2
爲當前表刪除列族:
hbase(main):002:0> alter ‘user’, ‘delete’ => ‘CF2’

9.disable/enable

禁用一張表/啓用一張表

10.drop

刪除一張表,記得在刪除表之前必須先禁用

11.truncate

禁用表-刪除表-創建表 得到一個空白的表,也叫清空表操作

5.HBase的Java代碼開發

通過java程序實現對HBase數據庫當中數據增刪改差操作

(1)創建maven工程,導入jar包

 <dependencies>
       <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
<dependency>
    			<groupId>org.apache.hbase</groupId>
    			<artifactId>hbase-server</artifactId>
    			<version>2.0.0</version>
</dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <!--    <verbal>true</verbal>-->
                </configuration>
            </plugin>
        </plugins>
    </build>

2.創建表myuser,並且帶有兩個列族f1,f2

package cn.it.hbase.demo;

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.junit.Test;

import java.io.IOException;

public class HBaseOpaerte {
    /**
     * 創建habase表myuser,來有兩個列族
     */

    @Test
    public void createTable() throws IOException {
        //1.設置conf
        Configuration conf = HBaseConfiguration.create();
        //2.指定hbase的zk連接地址
        conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        //3.連接hbase集羣
        Connection connection = ConnectionFactory.createConnection(conf);

        //4.獲取管理員對象
        Admin admin = connection.getAdmin();
        //5.通過管理員對象創建表
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("myuser"));
        //5.1添加列族
        HColumnDescriptor f1 = new HColumnDescriptor("f1");
        HColumnDescriptor f2 = new HColumnDescriptor("f2");
        //5.2將兩個列族設置到hTableDescriptor裏面去
        hTableDescriptor.addFamily(f1);
        hTableDescriptor.addFamily(f2);
        //5.3創建表
        admin.createTable(hTableDescriptor);

        admin.close();
        connection.close();

    }
}

在這裏插入圖片描述

(3)向表中添加數據

/**
     * 向表中添加數據
     */
    @Test
    public void addData() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        //獲取連接
        Connection connection = ConnectionFactory.createConnection(configuration);

        //獲取表對象
        Table myuser = connection.getTable(TableName.valueOf("myuser"));
        //添加數據
        Put put = new Put("0001".getBytes());
        put.addColumn("f1".getBytes(),"id".getBytes(), Bytes.toBytes(1));
        put.addColumn("f1".getBytes(),"name".getBytes(), Bytes.toBytes("張三"));
        put.addColumn("f1".getBytes(),"age".getBytes(), Bytes.toBytes(18));
        put.addColumn("f2".getBytes(),"addres".getBytes(), Bytes.toBytes("地球人"));
        put.addColumn("f2".getBytes(),"phone".getBytes(), Bytes.toBytes("12132432"));


        myuser.put(put);
        myuser.close();

    }

(3)查詢數據操作

在做查詢之前先添加一批數據到表中,方便後續操作的演示

@Test
    public void insertBatchData() throws IOException {

        //獲取連接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        //獲取表
        Table myuser = connection.getTable(TableName.valueOf("myuser"));
        //創建put對象,並指定rowkey
        Put put = new Put("0002".getBytes());
        put.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(1));
        put.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("曹操"));
        put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(30));
        put.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
        put.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("沛國譙縣"));
        put.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("16888888888"));
        put.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("helloworld"));

        Put put2 = new Put("0003".getBytes());
        put2.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(2));
        put2.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("劉備"));
        put2.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(32));
        put2.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
        put2.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("幽州涿郡涿縣"));
        put2.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("17888888888"));
        put2.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("talk is cheap , show me the code"));


        Put put3 = new Put("0004".getBytes());
        put3.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(3));
        put3.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("孫權"));
        put3.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(35));
        put3.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
        put3.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("下邳"));
        put3.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("12888888888"));
        put3.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("what are you 弄啥嘞!"));

        Put put4 = new Put("0005".getBytes());
        put4.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(4));
        put4.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("諸葛亮"));
        put4.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28));
        put4.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
        put4.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("四川隆中"));
        put4.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("14888888888"));
        put4.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("出師表你背了嘛"));

        Put put5 = new Put("0005".getBytes());
        put5.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5));
        put5.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("司馬懿"));
        put5.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(27));
        put5.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
        put5.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("哪裏人有待考究"));
        put5.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15888888888"));
        put5.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("跟諸葛亮死掐"));


        Put put6 = new Put("0006".getBytes());
        put6.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5));
        put6.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("xiaobubu—呂布"));
        put6.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28));
        put6.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
        put6.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("內蒙人"));
        put6.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15788888888"));
        put6.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("貂蟬去哪了"));

        List<Put> listPut = new ArrayList<Put>();
        listPut.add(put);
        listPut.add(put2);
        listPut.add(put3);
        listPut.add(put4);
        listPut.add(put5);
        listPut.add(put6);

        myuser.put(listPut);
        myuser.close();
    }

在這裏插入圖片描述

  • 以下爲查詢操作
/**
     * 查詢rowkey爲003的人,所有列
     */
    @Test
    public void getData() throws IOException {
        //獲取連接
        configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        connection = ConnectionFactory.createConnection(configuration);
        //獲取表
        table = connection.getTable(TableName.valueOf("myuser"));
        Get get = new Get("0003".getBytes());
		
		
        //限制查詢範圍,只查詢f1列族,
      //  get.addFamily("f1".getBytes());
        //限制查詢範圍,只查詢f1列族下的id列
      //  get.addColumn("f1".getBytes(),"id".getBytes());



        //Result是一個對象,封裝了所有的結果數據
        Result result = table.get(get);
        //獲取003的所以cell值
        List<Cell> cells = result.listCells();
        for (Cell cell : cells) {
            //獲取列族名稱
            String familyName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
            //獲取列名稱
            String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
            if (familyName.equals("f1") && columnNmae.equals("age") || columnNmae.equals("id")) {
                int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                System.out.println("列族名" + familyName + "列名" + columnNmae + "列的值" + value);
            } else {
                String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                System.out.println("列族名" + familyName + "列名" + columnNmae + "列的值" + value);
            }

        }
        table.close();

    }

在這裏插入圖片描述

(4)通過scan進行掃描

 /**
     * 安裝rowkey進行範圍掃描
     * 掃描rowkey0004到0006的所以值
     */
    @Test
    public void scanRange() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table table = connection.getTable(TableName.valueOf("myuser"));
        Scan scan = new Scan();
        //設置起始和結束的rowkey
        scan.setStartRow("0004".getBytes()); //這裏把範圍註釋掉運行就是全表掃描
        scan.setStopRow("0006".getBytes());
        //返回多條數據都封裝在ResultScanner中了
        ResultScanner scanner = table.getScanner(scan);

        for (Result result : scanner) {
            List<Cell> cells = result.listCells();
            for (Cell cell : cells) {
                String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
                String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
                String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){
                    int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println("數據的rowkey爲"+rowkey+"數據的列族爲"+fileName+"數據的列名"+columnNmae+"數據的值"+value);
                }else {
                    String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                    System.out.println("數據的rowkey爲"+rowkey+"數據的列族爲"+fileName+"數據的列名"+columnNmae+"數據的值"+value);
                }
            }
        }
    }

(5)過濾器查詢

1.比較過濾器

  1. 通過RowFilter過濾rowKey
  2. 列族過濾器FamilyFilter
  3. 列過濾器QualifierFilter
  4. 列值過濾器ValueFilter
 /**
     * 使用rowFilter查詢比0003小的所以的數據
     */
    @Test
    public void rowFileter() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table table = connection.getTable(TableName.valueOf("myuser"));
        Scan scan = new Scan();
		//*****核心點******
        //添加一個比較過濾器
        //通過RowFilter過濾rowKey中比0003小的rowkey中所有值出來
        RowFilter rowFilter = new RowFilter(CompareOperator.LESS, new BinaryComparator(Bytes.toBytes("0003")));
        scan.setFilter(rowFilter);
		
		//列族過濾器
		//查詢比f2列族小的所有列族裏面的數據
        FamilyFilter f2 = new FamilyFilter(CompareOperator.LESS, new SubstringComparator("f2"));
        scan.setFilter(f2);

		//列過濾器
        //只查詢name列的值
        QualifierFilter name = new QualifierFilter(CompareOperator.EQUAL, new SubstringComparator("name"));
        scan.setFilter(name);
			
		 //值過濾器
        //查詢所有列當中包含8的數據
        ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("8"));
        scan.setFilter(valueFilter);
		

		//*****核心點******


        //返回的數據都封裝在ResultScanner中,我們迭代遍歷獲取內容
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            List<Cell> cells = result.listCells();
            for (Cell cell : cells) {
                String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
                String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
                String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){
                    int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println("數據的rowkey爲"+rowkey+"數據的列族爲"+fileName+"數據的列名"+columnNmae+"數據的值"+value);
                }else {
                    String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                    System.out.println("數據的rowkey爲"+rowkey+"數據的列族爲"+fileName+"數據的列名"+columnNmae+"數據的值"+value);
                }
            }
        }

    }

2.專用過濾器

  1. 單列值過濾器SingleColumnValueFilter會返回滿足條件數據的所有字段
  2. 列值排除過濾器SingleColumnValueExcludeFilter會排除掉指定的列,其他的列全部返回
  3. rowkey前綴過濾器PrefixFilter
  4. 分頁過濾器PageFilter
  5. 多過濾器綜合查詢FilterList
 /**
     * 使用rowFilter查詢比0003小的所以的數據
     */
    @Test
    public void rowFileter() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table table = connection.getTable(TableName.valueOf("myuser"));
        Scan scan = new Scan();
		//*****核心點******
        //添加一個專用過濾器
        //單列值過濾器
        //查詢name值爲 劉備 的數據
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareOperator.EQUAL, "劉備".getBytes());
        scan.setFilter(singleColumnValueFilter);
		
		//前綴過濾器
        //查詢以00開頭的所有前綴的rowkey
        PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());
        scan.setFilter(prefixFilter);
		
		//多過濾器綜合查詢FilterList()
		//在上述兩個過濾器實現完成的基礎上,我們要使一個過濾器,擁有即是name爲劉備,又rowkey是00開頭的
		FilterList filterList = new FilterList(singleColumnValueFilter, prefixFilter);
        scan.setFilter(filterList);
		
	
		//*****核心點******


        //返回的數據都封裝在ResultScanner中,我們迭代遍歷獲取內容
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            List<Cell> cells = result.listCells();
            for (Cell cell : cells) {
                String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
                String fileName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
                String columnNmae = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                if (fileName.equals("f1") && columnNmae.equals("id") || columnNmae.equals("age")){
                    int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println("數據的rowkey爲"+rowkey+"數據的列族爲"+fileName+"數據的列名"+columnNmae+"數據的值"+value);
                }else {
                    String value = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                    System.out.println("數據的rowkey爲"+rowkey+"數據的列族爲"+fileName+"數據的列名"+columnNmae+"數據的值"+value);
                }
            }
        }

    }
  • 以下代碼是分頁的實現
/**
     * 實現hbase的分頁的功能
     */
    @Test
    public void habasePage() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table table = connection.getTable(TableName.valueOf("myuser"));
        int pageNum = 1; //
        int pageSize = 2;
        if(pageNum == 1){
            Scan scan = new Scan();
            //如果是查詢第一頁數據,就按照空來進行掃描
            scan.withStartRow("".getBytes());
            PageFilter pageFilter = new PageFilter(pageSize);
            scan.setFilter(pageFilter);
            //傳入設置好的scan,對錶進行掃描,返回的ResultScanner包含所掃描的數據
            ResultScanner scanner = table.getScanner(scan);
            //迭代遍歷得到數據
            for (Result result : scanner) {
                byte[] row = result.getRow();
                System.out.println(Bytes.toString(row));
            }
        }
    }

(6)刪除數據

1.根據rowkey刪除某一條數據

 /**
     * 根據rowkey刪除某一條數據
     * @throws IOException
     */
    @Test
    public void deleteData() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table table = connection.getTable(TableName.valueOf("myuser"));

        Delete delete = new Delete("0007".getBytes());
        table.delete(delete);
    }

2.刪除表

 /**
     * 刪除表
     * @throws IOException
     */
    @Test
    public void deletTable() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table table = connection.getTable(TableName.valueOf("myuser"));

        //獲取管理員權限
        Admin admin = connection.getAdmin();
        //禁用表
        admin.disableTable(TableName.valueOf("myuser"));
        //刪除表
        admin.deleteTable(TableName.valueOf("myuser"));

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