- 读取数据
- 单条数据查询
- 全表扫描
- 数据过滤属性
- 脚本查询
- 其他命令
hbase
是一款分布式数据库. 其对数据的索引只通过row key
进行. 在存储数据的时候, 通过row key
的排序进行存储. 在面对一个新的数据库时, 深究其原理并不知一个明智的选择, 正如开车一般, 大多数人都是先学会开车, 然后在开车的过程中车子出故障了, 再慢慢学着去修理. 不管怎么说, 第一步都是要先会使用.
这篇文章主要为了整理hbase
命令行的使用, 留待以后用到时翻阅.
读取数据
因为一个数据库使用, 通常最复杂的命令就是查询, 故而将大篇幅都给了查询. 哦对, 如果你现在还没有数据, 先跳到文章底部, 那里有建表和数据插入的操作.
hbase
没有索引, 访问hbase
中的数据只有三种方式:
- 通过指定
row key
访问 - 通过
row key
范围访问 - 全表扫描
单条数据查询
-
get '
','': 查询一行数据
get '
','','': 查询一行数据, 返回指定列族数据
全表扫描
-
scan '
': 返回全表数据
-
scan '
,{COLUMN=>''}: 返回全表指定列族数据
scan '
,{COLUMNS=>[': 返回全表指定列族的一个 key
到这里, 有没有对大括号中的属性值感兴趣? 其可以添加一些指定的过滤条件
数据过滤属性
数据过滤属性
这些内容, 不光可以在
scan
命令使用, 在count
, get
都可以用. 有一些暂时认为用不到的就直接忽略了, 可以通过help 'scan'
查看支持的所有属性. 其使用如下:
{属性1=>'值1, 属性2=>'值2'}
字段过滤
字段过滤
COLUMN
: 返回指定列族
''
COLUMNS
: 返回指定列族的一列
''
数量限制
数量限制
LIMIT
: 限制返回结果数量
row key 过滤
row key 过滤
STARTROW
: 限定扫描 row key 起始行STOPROW
: 限定扫描 row key 结束行ROWPREFIXFILTER
: row key 前缀匹配
排序
排序
REVERSED
: row key 倒序扫描
TRUE/FALSE
其他
其他
VERSIONS
: (int)返回多个版本的数据ALL_METRICS
: (bool)是否显示扫描的指标数据METRICS
: 查看指定指标数据
[""]
CACHE
: (int)指定每次要缓存多少条数据, 可加速查询MAXLENGTH
:(int) 指定返回数据的最大长度(可以用来限制返回超长的数据)
条件过滤
条件过滤
TIMERANGE
: 限定时间戳范围
[1303668804000, 1303668904000]
(毫秒, 前闭后开)TIMESTAMP
: 指定时间的数据FILTER
: 对结果进行过滤
对FILTER
进行额外的补充介绍
对FILTER
进行额外的补充介绍
过滤条件可添加多个, 如:
`FILTER=>"fun1() and (fun2() or fun3())"
你要是想问我文档在哪里?? 不好意思, 没找到. 不过经过我多方尝试, 发现这些方法都是
hbase
官方jar
包中实现的过滤功能, 也就是说, 如果你是用JAVA
开发, 那就可以自己写过滤器.
不过虽然没有找到官方文档, 我还是另辟蹊径找到了所有可用的过滤器. 没错, 就是去看
jar
包的内容. 看到这个过滤器的父类是: FilterBase
. 进而找到所有在org.apache.hadoop.hbase.filter
包下的实现类:
各个过滤器的参数, 可看其各自的构造方法. 简单列一下其中可用的方法:
row key 过滤
row key 过滤
PrefixFilter
: row key 前缀匹配
PrefixFilter('test')
: 匹配所有'test'开头的row keyFuzzyRowFilter
: row key 中间匹配(不支持命令行, 可通过RowFilter
正则实现)RowFilter
: 对 row key 进行比较
RowFilter(op, value)
: 参数参考 SingleColumnValueFilter
列名过滤
列名过滤
ColumnPrefixFilter
: 列族下的 key 前缀匹配
ColumnPrefixFilter('test')
: 匹配所有'test'开头的 keyMultipleColumnPrefixFilter
: 与ColumnPrefixFilter
作用类似, 不过可以匹配多个, 相当于多个ColumnPrefixFilter
的或操作
MultipleColumnPrefixFilter('test1', 'test2')
ColumnRangeFilter
: 列名区间匹配(比如一行数据有一万列, 返回其中部分). 字符串比较
minColumn
: 最小的列(string). max同理minColumnInclusive
: 是否包含最小列(bool). max 同理ColumnRangeFilter(minColumn, minColumnInclusive, maxColumn, maxColumnInclusive)
DependentColumnFilter
: 返回存在的匹配列(判断是否存在). (仅返回匹配列)
DependentColumnFilter(family, qualifier)
QualifierFilter
: 对列名进行匹配过滤
QualifierFilter(op, value)
: 参数参考 ColumnValueFilter
列值过滤
列值过滤
SingleColumnValueFilter
: 对列值进行比较过滤. 大于小于等于
family
: 列族名称qualifier
: 列名op
: =, !=, >, =...value
: 进行比较的值substring:xxx
: 字符串前缀比较 (只能使用=/!=)regexstring:xxx
: 字符串正则比较(只能使用=/!=)binary:xxx
: 字典序比较binaryprefix:xxx
: 字典序前缀比较ColumnValueFilter(family, qualifier, op, value)
SingleColumnValueExcludeFilter
: 参数与功能与SingleColumnValueFilter
相同. 不同点在于, 此方法返回时会去掉比较的列.ColumnValueFilter
: 与 SingleColumnValueFilter
类似. 唯一不同的是, 此过滤器只返回匹配的列. 而SingleColumnValueFilter
会返回整行数据KeyOnlyFilter
: 只返回列名, 不返回其对应的值(无参)TimestampsFilter
: 按照时间戳进行过滤, 返回指定时间戳的数据.
TimestampsFilter(time1, time2)
ValueFilter
: 对值进行匹配, 仅返回匹配列. 参数参考SingleColumnValueFilter
*ValueFilter(op, value)
数量过滤
数量过滤
ColumnCountGetFilter
: 返回每行的前 n 个列
ColumnCountGetFilter(limit)
ColumnPaginationFilter
: 返回每行n-m 列数据
ColumnPaginationFilter(limit, offset)
: 数量限制/偏移量FilterAllFilter
: 过滤所有内容. 不给客户端返回任何数据, 没有参数. 这有什么用(用来检查性能???)FirstKeyOnlyFilter
: 返回每行的第一个键值, 没有参数. (用来统计??)InclusiveStopFilter
: 提前结束遍历. 当遇到匹配的 row key时停止.
InclusiveStopFilter(stopRowKey)
PageFilter
: 限定返回一页的数据行数. 这玩意不就是 limit 么...
PageFilter(size)
RandomRowFilter
: 返回随机数据, 无参. (shell 不支持)
另外, 还有一些过滤器不支持命令行使用, 一些复杂参数的构造方法. 就暂时被我忽略了.
脚本查询
脚本查询
另外, 其命令行更厉害的一点是, 他可以直接执行
JAVA
代码, 而, 不对, 应该是类JAVA
代码.
比如:
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
再比如:
filter = SingleColumnValueFilter.new(Bytes.toBytes('user_info'), Bytes.toBytes('name'), CompareFilter::CompareOp.valueOf('EQUAL'),Bytes.toBytes('substring:xxx'))
再比如:
scan 'user', {FILTER => filter, LIMIT => 2}
而且, 这些命令都是可以直接跑在命令行的. 同时, 你也可以自己建一些脚本交给
shel
执行:
hbase shell cron.txt
shell
会依次执行文件中的命令. 这里还没有深究, 先简单记录一下有这么个事.
其他命令
其他命令
count '
': 查看记录总数
status
: 查看服务器状态version
: 查看版本list
: 查看所有表help ': 查询指定命令的帮助信息
表结构相关:
create '
','','',...: 建表
describe '
': 查看表的描述信息
alter '
', '': 增加一个列族
alter '
', {NAME => '', METHOD => 'delete’}: 删除一个列族
is_enabled '
': 查看表是否启用
is_disabled '
': 查看表是否禁用
enabled '
': 启用表
disabled '
': 禁用表
exists '
': 查看表是否存在
drop '
': 删除表(需要先禁用)
数据相关:
put '
','','','': 插入数据
delete '
', '','',: 删除数据(也可以不带时间戳, 删除所有版本)
deleteall '
', '': 删除一行数据