让我们首先了解 HBase 是如何存储它的数据的。
Hfile的KeyValue包括:
<keylength> <valuelength> <key> <value>
密钥分解为:
<rowlength> <row> <columnfamilylength> <columnfamily> <columnqualifier> <timestamp> <keytype>
一起来
<keylength> <valuelength> <key> <rowlength> <row> <columnfamilylength> <columnfamily> <columnqualifier> <timestamp> <keytype> <value>
HBase 是“面向列族的”。数据以物理方式存储在列族组中。这意味着给定列族的所有键值都存储在同一组文件中。
HBase 不提供任意列的索引,不提供连接,也不提供多行事务。如果你想根据它的列值查询一行,你最好为此维护一个二级索引,或者为全表扫描做好准备
较新版本的 Hbase HFile 具有内存高效的文件格式。但不保证查找所有行。
检查每一行的证明都在这里。
类名:org.apache.hadoop.hbase.filter.SingleColumnValueFilter
if (!keyValue.matchingColumn(this.columnFamily, this.columnQualifier)) {
return ReturnCode.INCLUDE;
}
if (filterColumnValue(keyValue.getBuffer(), keyValue.getValueOffset(), keyValue.getValueLength())) {
return this.latestVersionOnly? ReturnCode.NEXT_ROW: ReturnCode.INCLUDE;
}
以及来自 org.apache.hadoop.hbase.KeyValue 类的这个方法。
/**
*
* @param family column family
* @param qualifier column qualifier
* @return True if column matches
*/
public boolean matchingColumn(final byte[] family, final byte[] qualifier) {
int rl = getRowLength();
int o = getFamilyOffset(rl);
int fl = getFamilyLength(o);
int ql = getQualifierLength(rl,fl);
if (!Bytes.equals(family, 0, family.length, this.bytes, o, fl)) {
return false;
}
if (qualifier == null || qualifier.length == 0) {
if (ql == 0) {
return true;
}
return false;
}
return Bytes.equals(qualifier, 0, qualifier.length,
this.bytes, o + fl, ql);
}
Image credit: Cloudera-blog