HBase数据库与关系型数据库的区别(取材于官方文档)
2016-01-27 19:34
323 查看
HBase 数据被建模为多维映射,其中值(表单元)通过 4 个键索引:
value = Map(TableName, RowKey, ColumnKey, Timestamp)
其中:
TableName 是一个字符串。 是表名。
RowKey 和 ColumnKey 是二进制值(Java 类型 byte[])。 代表行健和列族。
Timestamp 是一个 64 位整数(Java 类型 long)。
value 是一个未解释的字节数组(Java™ 类型 byte[])。
二进制数据被编码为 Base64,以便通过网络传输。
行键是表的主键,通常是一个字符串。行通过行键按字典顺序排序。
存储在表中的信息的结构为列族(column family,就相当于列名),您可以将这种结构视为类别。每个列族可以拥有任意数量的成员,它们通过标签(或修饰符)识别。column 键(就是每列的值)由族名、:号和标签组成。例如,对于系列name 和成员 first,列键为 name: first。
(这里不是很好理解,看了下面的图可能就比较容易理解了,这个跟数据库有区分,可见,这里一行,不代表就一组数据,往往是多组数据的,一个rowkey可能对应多列的值,而每列的值(可以视为columnkey)是由列族名:标签组成),又如,name:last也是一个成员,他们都在于00001行键上,是00001行键的成员,成员值,就是value。
一个 HBase 表模式定义多个列族,但当您向表中插入一行时,应用程序能够在运行时创建新成员。对于一个列族,表中的不同行可以拥有不同数量的成员。换句话说,HBase 支持一个动态模式 模型。
参考下图更好理解
其实这些记录在hbase是根据TimeStamp排序的,所以这虽然上图看起来很工整,但是实际上载数据库里存放是凌乱的。000001和000002的成员交错着放,唯一定义一个成员的唯一值的行键+列族:标签。
以第一个成员为例:
000001是行键,列族是name和contact,列键(column键)是name:first 和name:last和contact:http ,Value值就是Jeffrey和Dean,还有research.google.com/people/jeff….
对于任意行,一次只能访问一个列族的一个成员(这与关系数据库不同,在关系数据库中,一个查询可以访问来自一个行中的多个列的单元)。您可以将一个行中的一个列族的成员视为子行。(这个是因为一行可以对应多组成员所定,跟数据库最大的不同在于此吧)
表被分解为多个表区域,等同于 Bigtable 片(tablet)。一个区域包含某个范围中的行。将一个表分解为多个区域是高效处理大型表的关键机制。
value = Map(TableName, RowKey, ColumnKey, Timestamp)
其中:
TableName 是一个字符串。 是表名。
RowKey 和 ColumnKey 是二进制值(Java 类型 byte[])。 代表行健和列族。
Timestamp 是一个 64 位整数(Java 类型 long)。
value 是一个未解释的字节数组(Java™ 类型 byte[])。
二进制数据被编码为 Base64,以便通过网络传输。
行键是表的主键,通常是一个字符串。行通过行键按字典顺序排序。
存储在表中的信息的结构为列族(column family,就相当于列名),您可以将这种结构视为类别。每个列族可以拥有任意数量的成员,它们通过标签(或修饰符)识别。column 键(就是每列的值)由族名、:号和标签组成。例如,对于系列name 和成员 first,列键为 name: first。
(这里不是很好理解,看了下面的图可能就比较容易理解了,这个跟数据库有区分,可见,这里一行,不代表就一组数据,往往是多组数据的,一个rowkey可能对应多列的值,而每列的值(可以视为columnkey)是由列族名:标签组成),又如,name:last也是一个成员,他们都在于00001行键上,是00001行键的成员,成员值,就是value。
一个 HBase 表模式定义多个列族,但当您向表中插入一行时,应用程序能够在运行时创建新成员。对于一个列族,表中的不同行可以拥有不同数量的成员。换句话说,HBase 支持一个动态模式 模型。
参考下图更好理解
其实这些记录在hbase是根据TimeStamp排序的,所以这虽然上图看起来很工整,但是实际上载数据库里存放是凌乱的。000001和000002的成员交错着放,唯一定义一个成员的唯一值的行键+列族:标签。
以第一个成员为例:
000001是行键,列族是name和contact,列键(column键)是name:first 和name:last和contact:http ,Value值就是Jeffrey和Dean,还有research.google.com/people/jeff….
对于任意行,一次只能访问一个列族的一个成员(这与关系数据库不同,在关系数据库中,一个查询可以访问来自一个行中的多个列的单元)。您可以将一个行中的一个列族的成员视为子行。(这个是因为一行可以对应多组成员所定,跟数据库最大的不同在于此吧)
表被分解为多个表区域,等同于 Bigtable 片(tablet)。一个区域包含某个范围中的行。将一个表分解为多个区域是高效处理大型表的关键机制。
相关文章推荐
- mysql btree与hash索引的适用场景和限制
- spring-data-mongodb报错
- SQL三种分页方式
- mysql慢查询
- Oracle导出导入指定表
- Oracle导出导入指定表
- Java之XMemcached使用及源码详解
- MongoDB介绍
- mysql优化随笔
- MySQL中EXPLAIN详解
- 实用技巧数据库自增数字ID转成六位数字和字母的串。(如不想暴露ID的注册邀请码)
- 配置MongoDB3.04集群分片
- oracle 11g duplicate active database 建立物理DG
- MySQL优化方法
- mysql里字符集的配置
- mysql清空带外键的表
- mysql修改用户密码
- MySQL事务介绍及原理
- 文章标题
- mongoDb地理空间索引和查询