HBase
是一种开源的分布式非关系型数据库 (NoSQL)
,专为在大型数据集上实现高性能读写而设计,其构建在 Hadoop
分布式文件系统 (HDFS)
之上,具有良好的水平扩展能力并与 Hadoop
生态系统的高度集成。
HBase
的一大核心优势即可以动态的扩展列而不像传统的关系型数据库需要修改固定的表结果,同时依托于 Hadoop
的能力对于海量数据处理拥有出色的性能表现。
本文将介绍
HBase
数据库基础的DDL
与DML
语法使用。
一、DDL操作
1. Namespace
HBase
的 Namespace
你可以理解为 MySQL
的数据库或者 Oracle
的 Schema
。
-- 列出所有 namespace
list_namespace
-- 创建 namespace
create_namespace '<name>'
-- 删除 namespace
drop_namespace '<name>'
2. 表管理
在 HBase
中一张表包含多个 蔟族
,而每个 蔟族
下又可包含多个 列
,而 列
与常见的数据库字段定义类似。
通过 create
关键字新建表,未指定 namespace
时为 default
,注意一张表至少需要一个蔟族 (cluster)
。
-- 列出所有表
list
-- 建表
create '<namespace>:<table>', '<cluster-1>', ..., '<clustern-n>'
-- 示例
create 'budai:user', 'info', 'score'
3. 表禁用
通过 Drop
关键字删除表,需要注意删除表之前需要先禁用表。
-- 禁用表
disable '<namespace>:<table>'
-- 是否禁用
is_disabled '<namespace>:<table>'
-- 删除表(需要先禁用)
drop '<namespace>:<table>'
-- 删除表(自动禁用再删除)
truncate '<namespace>:<table>'
二、DML操作
1. 数据插入
通过 put
关键字向表中添加字段,需要注意 put
一次只能添加一个列的值,若需要插入大量数据建议通过代码程序进行。
其中 row_key
类似于每条记录的主键,可以通过该值快速查找记录。
-- 新增数据,一次只能添加一个列
put '<namespace>:<table>', '<row_key>', '<cluster:cloumn>', '<value>'
-- 示例
put 'budai:user', '1', 'info:id', '123'
put 'budai:user', '1', 'info:name', 'alex'
put 'budai:user', '1', 'score:math', '80'
put 'budai:user', '1', 'score:english', '86'
完成插入后表中数据即如下所示:
Row Key | Info | Score | ||
---|---|---|---|---|
- | Id | Name | Math | English |
1 | 123 | alex | 80 | 86 |
2. 数据查询
通过 Get
关键字可实现简单的语句查询,若需要实现复合查询建议使用 Scan
查询。
-- 查看行
get '<namespace>:<table>', 'row_key'
-- 查看列族
get '<namespace>:<table>', 'row_key', '<cluster>'
-- 查看列
get '<namespace>:<table>', 'row_key', '<cluster:cloumn>'
3. 高级查询
通过 Scan
配合 FILTER
等关键字可实现类 MySQL
的复合查询。
-- 等价 select * from table
scan '<namespace>:<table>'
-- 等价 select * from table where cloumn = 'value'
scan '<namespace>:<table>', COLUMNS => '<cluster:cloumn>', FILTER => "ValueFilter(=,'binary:<value>')"
-- 模糊查询, 等价 select * from table where cloumn like 'value'
scan '<namespace>:<table>', COLUMNS => '<cluster:cloumn>', FILTER => "ValueFilter(=,'substring:<value>')"
-- 组合查询, 等价 select * from table where cloumn = 'value'
scan '<namespace>:<table>', FILTER => "ColumnPrefixFilter('<cloumn>') AND ValueFilter(=,'binary:<value>')"
4. 数据删除
与常见数据库不同的是 HBase
的 delete
是删除单个列的值,若要删除整条记录需要通过 deleteall
关键字。
-- 删除单个列数据
delete '<namespace>:<table>', 'row_key', '<cluster:cloumn>'
-- 删除整条记录
deleteall '<namespace>:<table>', 'row_key'