HBase總結(2) 資料查詢與Get物件

2021-07-10 06:52:23 字數 4919 閱讀 7328

一、介紹

在hbase客戶端的api中提供了兩種從伺服器端獲取資料的方式。get行獲取和scan掃瞄表的方式。下面就簡單介紹一些使用get獲取資料時的使用方法

二、資料獲取

get資料的獲取與上節put資料插入一樣,分為多種使用方式。

1、單行獲取:get(get get)

單行獲取每次rpc請求值傳送乙個get物件中的資料,因為get物件初始化時需要輸入行鍵,因此可以理解為乙個get物件就代表一行。一行中可以包含多個列簇或者多個列等資訊

public void get(string tablename,string rowkey,string family,string qualifier)

admin.close();

//建立表連線

htable table=new htable(conf,tablename.valueof(tablename));

//建立乙個獲取物件

get get=new get(bytes.tobytes(rowkey));

//根據傳入的值,進行獲取判斷

if(family!=null && qualifier!=null)

else if(family != null && qualifier == null)

//獲取資料

result result=table.get(get);

keyvalue kvs=result.raw();

for(keyvalue kv:kvs)

} catch (exception e)

}

從上述**中我們可以看到,get例項使用 addcolumn / addfamily 著兩個函式想get中新增搜尋範圍。如果沒有新增,則表示將整行資料進行返回。如果新增列簇,則將指定的列簇中的所有列進行返回,如果指定列,則將制定的列進行返回。

2、獲取多行: get(listlist)

多行獲取獲取實質就是在**中對list例項進行迭代,從而傳送多次資料請求(即多個rpc請求與資料操作,一次請求包含一次rpc請求和一次資料傳輸)。

public void getlist(string tablename,string rows,string families,string qualifiers)

//建立表連線

htable table=new htable(conf, bytes.tobytes(tablename));

listgets=new arraylist<>();

int length=rows.length;

for(int i=0;i

3、獲取資料或者前一行:getroworbefore()

該函式是htable類提供的乙個藉口。作為為:當引數中的行存在時,則將本行指定的列簇進行返回,如果不存在時,則返回表中存在的指定行的前一行的資料進行返回。

public void getroworbefore(string tablename,string row,string family,string qualifier)

//建立表連線

htable table=new htable(conf, tablename);

//執行函式

result result=table.getroworbefore(bytes.tobytes(row),bytes.tobytes(family));

//進行迴圈

keyvalue keyvalues=result.raw();

for(keyvalue kv: keyvalues)

table.close();

} catch (exception e)

}

注意:在函式中需要注意的是,所有行的row在hbase中的儲存都是byte陣列,其沒有具體的型別,因此row-10 是小於 row-9。因此在進行比較是在第五位中1是小於9,hbase資料庫則會認為row-10 是小於 row-9 的。如果指定順序的話,則需要將資料的row的位數規定一致。則 row-9 應該更改為 row-09。通過這樣的修改可以保證 row-09 是小於 row-10的。

4、結果顯示:result物件、keyvalue物件與cell物件

(1)result物件,在查詢得到的結果,每一行資料會被作為乙個result物件,將資料存入到乙個result例項中。當我們需要獲取一行資料時則需要獲取該行資料所在的result物件即可。該物件內部封裝了乙個keyvalue 物件陣列。在0.98.4以前的本班。result類提供了 raw() 方法去獲取整個result物件中的keyvalue陣列。在0.98.4以後,則提供了乙個新的節後: rowcells() 方法獲取keyvalue物件,不過返回的是keyvalue 物件父類引用。

(2)keyvalue物件。該物件我們已經進行過介紹。因此這裡我們只進行其使用的展示

public void kvobject(string tablename,string row,string family,string qualifier)

admin.close();

//建立表連線

htable table=new htable(conf, tablename);

//查詢一行並返回result物件

get get=new get(bytes.tobytes(row));

result result=table.get(get);

//進行迴圈

keyvalue keyvalues=result.raw();

for(keyvalue kv: keyvalues)

table.close();

} catch (exception e)

}

(3)cell物件:cell物件是keyvalue物件的父類,cell物件中的所有方法在keyvalue物件中全部被實現。因此根據繼承的特徵,我們可以使用cell物件中的api操作keyvalue物件。

public void cellobject(string tablename,string row,string family,string qualifier)

admin.close();

//建立表連線

htable table=new htable(conf, tablename);

get get=new get(bytes.tobytes(row));

get.addcolumn(bytes.tobytes(family), bytes.tobytes(qualifier));

result result=table.get(get);

cell cells=result.rawcells();

for(cell cell:cells)

table.close();

} catch (exception e)

}

三、get物件的詳細配置

上述講述了如何使用get從hbase中獲取資料,並將資料進行展示,其實get物件中的很多屬性可以控制在進行查詢時的細節控制,從而控制資料從hbase伺服器返回時的資料量,從而可以進行資料優化

(1)get(byte row) / get(byte row, rowlock lock)

初始化函式。在初始化函式時必須要指定get將要獲取的行鍵,第二個函式則是允許使用者自己對get上乙個行鎖,但是系統並不贊成使用者這麼使用。因為在多個客戶端進行操作,且都上了自定義的行鎖以後,可能會出現因為彼此的行鎖需要對方的資源而死鎖現象。但是兩個客戶端的長時間等待與系統連線資源的占用。

(2)addfamily()  / addcolumn()

新增列簇 / 新增列函式。通過該函式get在資料獲取時,獲取的資料範圍:兩個函式都不設定時獲取正行的所有資料。 使用 addfamily時獲取制定列簇的所有列的資料。 addcolumn則獲取制定列的資料

(3)settimestamp()

獲取指定的時間戳物件

(4)settimerange(long mintime,long maxtime)

獲取該時間戳範圍內的資料

(5)setmaxversion(int version) / setmaxversion()

在預設情況下,get方法之獲取一列的最新的版本。但是有時需要的話則會一次獲取多個版本的資料。 第乙個函式可以指定確切的返回的版本數量。第二個函式則相當於setmaxversion(integer.max_value)。即獲取列中所有版本的 資料。

(6)setcacheblock(boolean open)

是否開啟伺服器端快快取。在hbase中,整個表以region分塊的方式被分布式的存在不同的region伺服器中。每乙個region伺服器將會維護多個region。而在每乙個region中都會存在快快取區域。當每次去讀某乙個keyvalue資料塊時,則會將整個資料載入到快取區中。又因為載入的資料遠大於乙個keyvalue所含的資料大小。所以一般情況下快取區域內都會存放當前keyvalue物件的連續的資料。但是如果在隨機讀寫的程式中,這種資料載入進入快取區並沒有任何的作用,反而會因為在家時間而使得資料獲取時間增長。因此我們要根據實際情況去選擇是否開啟region上的快取區。連續讀寫時,開始快取區可以增加搜尋速度。在隨機讀寫時,關閉快取區可以縮小讀取時間。

(7)setfilter(filter f)

新增過濾器。因為hbase並沒有原聲的sql指定環境,因此在sql語句中的where條件語句就需要通過特定的藉口去實現,而filter則就是頂替了where 語句的作用。能夠實現在在資料查詢中的一些精細的控制。過濾器的內容會在後面的章節進行詳細的解釋

四、總結

上述主要講解了get的使用和一些在進行資料獲取時的需要注意的點,有時候可以通過修改特定的屬性從而達到不同的效果。而get類中的大部分api並沒有被提到,因此如果繼續需要深入學習的話可以去官網的 api中詳細檢視get類中的所有的api。如果上述有錯誤的地方,還望指出,共勉。

HBase資料查詢之常規查詢

簡述 訂單常規查詢用到的字段可能有 店鋪id 訂單建立時間 不變數 訂單id 訂單狀態等等。如下設計適用場景 a.dp id created段查詢 狀態或者其他filter條件 b.tid查詢 表設計分兩張表 1.用於常規查詢表,rowkey dp id created tid cf status ...

為什麼HBase資料查詢快速

快速查詢可以分作兩方面 一是根據億級的記錄中快速查詢,二是以實時的方式查詢資料。a 如果快速查詢 從磁碟讀資料 hbase是根據rowkey查詢的,只要能快速的定位rowkey,就能實現快速的查詢,主要是以下因素 1 hbase是可劃分成多個region,你可以簡單的理解為關係型資料庫的多個分割槽。...

SQL資料查詢2

use hcreate table zy1 empno int,ename varchar 10 job varchar 10 mgr int,hiredate date,sal double coom double deptno int drop table zy1 desc zy1 select...