HBase是否会扫描不包含我想要返回的族的行

时间:2014-04-24 19:15:11

标签: java hadoop hbase crud nosql

我正在使用HBase CDH3,而我正在设计我的HBase表。让我们说我的所有rowkeys都经过哈希处理,我有2个列系列colFamA和colFamB。对于每一行,将存储在colFamA或colFamB中的值,但不是两者都存储。

如果我设置扫描仪扫描每一行,并在扫描仪中指定

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

所以我只想要colFamA值而不是colFamB值,我的扫描仪是否还要扫描不包含colFamA数据的行(即只有colFamB值的行)?即使我没有将它作为要在我的扫描中返回的列添加,但是存在colFamB的事实是否会减慢此扫描速度?

3 个答案:

答案 0 :(得分:1)

一个字的答案是否定的。

稍微长一点的答案是:HBase根本不会在扫描期间处理不需要的家庭。每个家庭实际上都存储在不同的存储空间中,因此很明显没有必要在未指定的系列中搜索某些内容。如果未指定系列,则扫描所有系列。

更详细的解释:至少AFAIK for HBase 0.96我看到有RegionScanner接口和RegionScannerImpl类,它是HRegion的成员。此扫描程序构造函数检查是否在您的Scan对象中指定了系列,并根据系列数组(每个存储)确定其他扫描程序列表。

答案 1 :(得分:0)

Hbase中的数据存储在区域中,每个区域只有1个列族。当您扫描一个列族时,扫描程序将仅读取与该列族相关的区域中的Hfiles中该列族的数据。它不会读取其余列族的数据。

答案 2 :(得分:-1)

它只返回colFamA

中的值