Hbase相关操作

数据模型的基本概念

HBase 中的数据被存储在表中,具有行和列,是一个多维的映射结构。本节将对与 HBase 数据模型相关的基本概念进行统一介绍。,

1. 表(Table)

HBase采用表来组织数据,表由许多行和列组成,列划分为多个列族。

2. 行(Row)

在表里面,每一行代表着一个数据对象。每一行都是由一个行键(Row Key)和一个或者多个列组成的。行键是行的唯一标识,行键并没有什么特定的数据类型,以二进制的字节来存储,按字母顺序排序。

因为表的行是按照行键顺序来进行存储的,所以行键的设计相当重要。设计行键的一个重要原则就是相关的行键要存储在接近的位置,例如,设计记录网站的表时,行键需要将域名反转(例如,org.apache.www、org.apache.mail、org.apache.jira),这样的设计能使与 apache 相关的域名在表中存储的位置非常接近。

访问表中的行只有 3 种方式:通过单个行键获取单行数据;通过一个行键的区间来访问给定区间的多行数据;全表扫描。

3. 列(Column)

列由列族(Column Family)和列限定符(Column Qualifier)联合标识,由“:”进行间隔,如 family:qualifiero

4. 列族(Column Family)

在定义 HBase 表的时候需要提前设置好列族,表中所有的列都需要组织在列族里面。列族一旦确定后,就不能轻易修改,因为它会影响到 HBase 真实的物理存储结构,但是列族中的列限定符及其对应的值可以动态增删。

表中的每一行都有相同的列族,但是不需要每一行的列族里都有一致的列限定符,所以说是一种稀疏的表结构,这样可以在一定程度上避免数据的冗余。

HBase 中的列族是一些列的集合。一个列族的所有列成员都有着相同的前缀,例如,courses:history 和 courses:math 都是列族 courses 的成员。“:”是列族的分隔符,用来区分前缀和列名。列族必须在表建立的时候声明,列随时可以新建。

5. 列限定符(Column Qualifier)

列族中的数据通过列限定符来进行映射。列限定符不需要事先定义,也不需要在不同行之间保持一致。列限定符没有特定的数据类型,以二进制字节来存储。

6. 单元(Cell)

行键、列族和列限定符一起标识一个单元,存储在单元里的数据称为单元数据,没有特定的数据类型,以二进制字节来存储。

7. 时间戳(Timestamp)

默认情况下,每一个单元中的数据插入时都会用时间戳来进行版本标识。

读取单元数据时,如果时间戳没有被指定,则默认返回最新的数据;写入新的单元数据时,如果没有设置时间戳,则默认使用当前时间。每一个列族的单元数据的版本数量都被 HBase 单独维护,默认情况下,HBase 保留 3 个版本数据。

1.进入shell

hbase(main):003:0>hbase shell

2.查看所有表

hbase(main):003:0> list

3.根据rowKey查询某个记录

hbase(main):003:0>get '表名','rowKey'

4.常用过滤器

  

过滤方式是通过value过滤,匹配出value含7259的数据。

scan 'buss_surface', FILTER=>"ValueFilter(=,'substring:7259')"

过滤方式是通过rowkey过滤,匹配出rowkey含7259098的数据。
scan 'buss_surface', FILTER=>"RowFilter(=,'substring:7259098')"

过滤方式是通过rowkey过滤,匹配出rowkey等于7259098168305156_4的数
scan 'buss_surface', FILTER=>"RowFilter(=,'binary:7259098168305156_4')"

过滤方式是通过rowkey过滤,匹配出rowkey小于等于7259098168305156的数据。

scan 'buss_surface', FILTER=>"RowFilter(<=,'binary:7259098168305156')"

过滤方式是通过rowkey过滤,匹配出rowkey为7259098开头的
scan '匹配出rowkey', FILTER => "PrefixFilter ('7259098')"

过滤方式是通过rowkey过滤,从rowkey的7259098168305156开始,找到所有的rowkey以7259098168305156_1开头的记录
scan 'buss_surface', {STARTROW=>'7259098168305156', FILTER => "PrefixFilter ('7259098168305156_1')"}

过滤方式是通过rowkey过滤,从rowkey的5655625207749390_3_20211213164715开始,找到所有的到rowkey以7259098168305156开头之前的记录
scan 'buss_tra_record_history_tmp', {STARTROW=>'5655625207749390_3_20211213164715', STOPROW=>'7259098168305156'}

向Hbase插入数据;

HBase 使用 put 命令向数据表中插入数据,put 向表中增加一个新行数据,或覆盖指定行的数据。
 

示例:Student 数据表
行键列族 StuInfo列族 Grades时间戳
NameAgeSexClassBigDataComputerMath
0001Tom Green18Male809085T2
0002Amy19019589T1
0003Allen19Male029088T1


例如有以上结构的数据表,向其中插入一条数据的写法为:

put 'Student', '0001', 'Stulnfo:Name', 'Tom Green', 1

在上述命令中:

  • 第一个参数Student为表名;
  • 第二个参数0001为行键的名称,为字符串类型;
  • 第三个参数StuInfo:Name为列族和列的名称,中间用冒号隔开。列族名必须是已经创建的,否则 HBase 会报错;列名是临时定义的,因此列族里的列是可以随意扩展的;
  • 第四个参数Tom Green为单元格的值。在 HBase 里,所有数据都是字符串的形式;
  • 最后一个参数1为时间戳,如果不设置时间戳,则系统会自动插入当前时间为时间戳。


注意,put 命令只能插入一个单元格的数据,上表中的一行数据需要通过以下几条命令一起完成:

put 'Student', '0001', 'StuInfo:Name', 'Tom Green', 1
put 'Student', '0001', 'StuInfo:Age', '18'
put 'Student', '0001', 'StuInfo:Sex', 'Male'
put 'Student', '0001', 'Grades:BigData', '80'
put 'Student', '0001', 'Grades:Computer', '90'
put 'Student', '0001', 'Grades:Math', '85'

如果 put 语句中的单元格是已经存在的,即行键、列族及列名都已经存在,且不考虑时间戳的情况下,执行 put 语句,则可对数据进行更新操作。

如以下命令可将行键为 0001 的学生姓名改为 Jim Green:

put 'Student', '0001', 'Stulnfo:Name', 'Jim Green'

如果在初始创建表时,已经设定了列族 VERSIONS 参数值为 n,则 put 操作可以保存 n 个版本数据,即可查询到行键为 0001 的学生的 n 个版本的姓名数据。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值