2014-04-24 61 views
1

我正在使用HBase CDH3,並且正在設計我的HBase表。假設我所有的rowkeys都是散列的,並且我有2個列族colFamA和colFamB。對於每一行,都會存儲在colFamA或colFamB中的值,但不能同時存在。請問HBase掃描不包含我想返回的系列的行

如果我成立了一個掃描儀中的每一行掃描結束了,我在我的掃描儀指定

Scan scan = new Scan();  
scan.addFamily(Bytes.toBytes("colFamA"); 
hTable.getScanner(scan); 

所以我只想colFamA值,而不是colFamB值,將我的掃描儀仍然掃描整個行不包含colFamA的數據(即只有colFamB值的行)?即使我沒有添加它作爲要在掃描中返回的列,colFamB會減慢掃描的速度嗎?

回答

1

一個字的答案是否定的。

稍微長一點的答案是:HBase在掃描過程中不會處理不需要的家族。每個家庭實際上都存儲在不同的存儲空間中,因此顯然不需要搜索某些未指定的家庭。如果沒有指定家庭,則掃描所有家庭。

更詳細的解釋:至少在AFAIK爲HBase 0.96我看到有RegionScanner接口和RegionScannerImpl類是HRegion的成員。此掃描器構造函數會檢查您的Scan對象是否指定了系列,並且根據系列數組(每個商店)確定其他掃描器列表。

-1

它只會返回colFamA的值

+0

我知道它只會返回colFamA,但是在執行掃描時,掃描程序是隻掃描與colFamA相關的行,還是需要掃描與colFamB相關的行,即使我不希望colFamB返回 – Tucker

+0

不,它不會掃描colFamB。 – mashuai

0

Hbase中的數據存儲在區域中,每個區域只有1個列族。當您正在掃描一個列族時,掃描程序只會在與該列族相關的區域中的Hfiles中讀取該列族的數據。它不會讀取其餘列系列的數據。