Spark獲取HBase海量資料方式之Scan

2021-10-07 21:00:59 字數 2675 閱讀 5940

scan掃瞄,類似於資料庫系統中的游標,底層依賴順序儲存的資料結構。掃瞄操作的作用跟get()方式非常類似,但由於掃瞄操作的工作方式類似於迭代器,所以使用者無需呼叫scan()方法建立例項,只需呼叫htable的getscanner()方法【或者使用new scan()】,此方法在返回真正的掃瞄器scanner例項的同時,使用者也可以使用它的迭代來獲取資料。如下:

resultscanner getscanner

(scan scan)

throws ioexception

resultscanner getscanner

(byte

family)

throws ioexception

resultscanner getscanner

(byte

family,

byte

qualifier)

throws ioexception

後兩個為了方便使用者,隱式地建立了乙個scan例項,邏輯中呼叫getscanner(scan scan)方法。

scan類擁有以下構造器:

scan()

// hbase2.x中統一使用set***加以配置

scan

(byte

startrow)

// hbase2.x中已失效

scan

(byte

startrow, filter filter)

// hbase2.x中已失效

scan

(byte

startrow,

byte

filter)

// hbase2.x中已失效

這與get類的不同點時顯而易見的,使用者可以選擇性地提供startrow引數來定義掃瞄讀取hbase表的起始行鍵,即行鍵不是必須指定的。同時可選stoprow引數來限定讀取到何處停止【hbase1.x】。

備註:起始行包括在內,終止行不包括在內。用區間表示為[startrow, stoprow)。

掃瞄操作有乙個特點,使用者提供的引數不必精確匹配到某一行。掃瞄會匹配相等或大於給定起始行鍵的資料。如果沒有顯式地指定起始行,它會從表的起始位置開始獲取資料。終止行與之類似,但不會獲取相同行。

另乙個可選引數叫做過濾器filter,可直接指向filter例項。儘管scan例項通常由空白構造器構造,但其所有可選引數都有對應的getter和setter方法。

建立scan例項後,使用者可能還要給它增加更多的限制條件。這種情況下,使用者仍然可以使用空白引數掃瞄,讀取整個表,包括所有列族和其所屬的所有類。可以使用多種方法限制所要讀取的資料:

scan addfamily

(byte

family)

scan addcolumn

(byte

family,

byte

qualifier)

可以使用addfamily()方法限制返回資料的列族,或者使用addcolumn()方法限制返回的列。

備註:如果使用者只需要資料的子集,那麼限制掃瞄的範圍就能發揮hbase的優勢。因為hbase中的資料是按列族儲存的,如果掃瞄不讀取某個列族,那麼整個列族檔案就不會被讀取,這就是列式儲存架構的優勢!

scan settimerange

(long minstamp,

long maxstamp)

throws ioexception

scan settimestamp

(long timestamp)

scan settimestamp

(long timestamp)

// hbase2.x中已失效,注意大小寫

scan setmaxversions()

// hbase2.x中已失效

scan setmaxversions

(int maxversions)

// hbase2.x中已失效

使用者可以通過settimestamp()設定詳細的時間戳,或者通過settimerange()設定時間範圍進一步對結果進行限制。。還可以使用setmaxversions()方法,讓掃瞄只返回每一列的一些特定版本,或者全部的版本。

scan setstartrow

(byte

startrow)

// hbase2.x中已失效

scan setstoprow

(byte

stoprow)

// hbase2.x中已失效

scan setfilter

(filter filter)

boolean

hasfilter

()

還可以使用setstartrow()、setstoprow()以及setfilter()來進一步限定返回的資料。這3個方法中的引數可以與構造器中的一樣。附加的hasfilter()方法可以檢查是否已經設定過濾器。

其它方法如下:

spark報錯無權訪問hbase

我在提交乙個乙個spark任務是,遇到乙個無權訪問hbase的異常,如下 org.apache.hadoop.hbase.ipc.remotewithextra ception org.apache.hadoop.hbase.security.accessdeniedexception org.ap...

k8s集群中 spark訪問hbase中資料

架構系列文章 首先我們需要對hbase的訪問原理非常清楚.可以參考 我們這裡已經在k8s中部署了hdfs和zookeeper以及hbase.部署可以參考 hbase資料分割槽是按照region進行的,分割槽的location就是各個region的location。那麼後續分配executor時可以按...

hbase資料加鹽讀取(spark篇)

未加鹽資料 spark可以使用inputformat outputformat來讀寫hbase表。加鹽以後 需要在rowkey之前加一些字首,否則是查不到資料的。1 我們需要重新寫getsplits方法 從名字我們可以知道是要計算有多少個splits。在hbase中,乙個region對用乙個spli...