我正在使用hbase cdh3,并且正在设计我的hbase表。假设我所有的行键都是散列的,我有两个列族colfama和colfamb。对于每一行,将有值存储在colfama或colfamb中,但不能同时存储在两者中。
如果我设置一个扫描器扫描每一行,我在扫描器中指定
Scan scan = new Scan();
scan.addFamily(Bytes.toBytes("colFamA");
hTable.getScanner(scan);
所以我只需要colfama值,而不是colfamb值,我的扫描器是否仍然需要扫描不包含colfama数据的行(即只有colfamb值的行)?有colfamb的事实会减慢这个扫描吗?即使我没有将它添加为要在扫描中返回的列?
3条答案
按热度按时间yvgpqqbh1#
它只返回
colFamA
6l7fqoea2#
hbase中的数据存储在区域中,每个区域只有一个列族。当您扫描一个列族时,扫描仪将只读取与该列族相关的区域中的hfiles中该列族的数据。它不会从其余列族中读取数据。
wsewodh23#
一个字的答案是不。
稍微长一点的答案是:hbase根本不处理扫描过程中不需要的家庭。每个族实际上都存储在不同的存储中,因此显然不需要在未指定的族中搜索某些内容。如果未指定族,则扫描所有族。
更详细的解释是:至少对于hbase0.96我看到有
RegionScanner
接口和RegionScannerImpl
属于的类HRegion
. 此scanner构造函数检查是否已将族指定到Scan
对象和其他扫描器列表基于族数组(每个存储)确定。