我正在使用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的事实是否会减慢此扫描速度?
答案 0 :(得分:1)
一个字的答案是否定的。
稍微长一点的答案是:HBase根本不会在扫描期间处理不需要的家庭。每个家庭实际上都存储在不同的存储空间中,因此很明显没有必要在未指定的系列中搜索某些内容。如果未指定系列,则扫描所有系列。
更详细的解释:至少AFAIK for HBase 0.96我看到有RegionScanner
接口和RegionScannerImpl
类,它是HRegion
的成员。此扫描程序构造函数检查是否在您的Scan
对象中指定了系列,并根据系列数组(每个存储)确定其他扫描程序列表。
答案 1 :(得分:0)
Hbase中的数据存储在区域中,每个区域只有1个列族。当您扫描一个列族时,扫描程序将仅读取与该列族相关的区域中的Hfiles中该列族的数据。它不会读取其余列族的数据。
答案 2 :(得分:-1)
它只返回colFamA