因为HBase表是稀疏表,HBase不仅存储每个单元格的值,还存储识别该单元格所需的所有信息(通常称为Key,不要与RowKey混淆)。关键字如下:
RowKey-ColumnFamily-ColumnQualifier-Timestamp
所有这些信息都存储在每个条目中。这就是为什么建议为列族和列限定符使用短名称以减少额外开销的原因。
我的问题:为什么我需要为每个条目存储ColumnFamily ?根据我的理解,每个存储文件只属于一个列族。在每个存储文件中存储一次列族名称还不够吗?这将减少开销,可以使用任意Column Family名称,并且我们仍然能够识别每个条目的Column Family。我遗漏了什么?
与关系数据库一样,HBase中的表由行和列组成。在HBase中,列以列族的形式组合在一起。这种分组在逻辑上表示为映射的映射中的一个层。列族也用物理形式表示。每个列族在磁盘上都有自己的一组hfile。这种物理隔离允许一个列族的底层hfile在与其他列族隔离的情况下进行管理。就压缩而言,每个列族的HF文件都是独立管理的。
我认为原因可能只是由于简单和键结构直接映射到RPC表示的事实。这将需要更多的内部复制和翻译,以便在写入列族之前删除列族,并在读取列族之后重新创建列族。我猜性能折衷比听起来更重要,但我不知道HBase开发人员是否尝试过这种特殊的变体。我知道,如果您关心列族和列的空间,您可以打开数据块编码以最小化开销。您还可以查看Kiji项目,它可以为您缩短这些名称,并为您的代码提供翻译层,这意味着您仍然可以使用更长的名称而不用担心成本。