hbase
是一款分布式数据库. 其对数据的索引只通过row key
进行. 在存储数据的时候, 通过row key
的排序进行存储. 在面对一个新的数据库时, 深究其原理并不知一个明智的选择, 正如开车一般, 大多数人都是先学会开车, 然后在开车的过程中车子出故障了, 再慢慢学着去修理. 不管怎么说, 第一步都是要先会使用.
这篇文章主要为了整理hbase
命令行的使用, 留待以后用到时翻阅.
因为一个数据库使用, 通常最复杂的命令就是查询, 故而将大篇幅都给了查询. 哦对, 如果你现在还没有数据, 先跳到文章底部, 那里有建表和数据插入的操作.
hbase
没有索引, 访问hbase
中的数据只有三种方式:
row key
访问row key
范围访问get '<table name>','<row key>'
: 查询一行数据get '<table name>','<row key>','<column family>'
: 查询一行数据, 返回指定列族数据scan '<table name>'
: 返回全表数据scan '<table name>,{COLUMN=>'<column family>'}
: 返回全表指定列族数据scan '<table name>,{COLUMNS=>['<column family:key']}
: 返回全表指定列族的一个 key到这里, 有没有对大括号中的属性值感兴趣? 其可以添加一些指定的过滤条件
这些内容, 不光可以在scan
命令使用, 在count
, get
都可以用. 有一些暂时认为用不到的就直接忽略了, 可以通过help 'scan'
查看支持的所有属性. 其使用如下:
{属性1=>'值1, 属性2=>'值2'}
COLUMN
: 返回指定列族'<column family>'
COLUMNS
: 返回指定列族的一列'<column family:key>'
LIMIT
: 限制返回结果数量STARTROW
: 限定扫描 row key 起始行STOPROW
: 限定扫描 row key 结束行ROWPREFIXFILTER
: row key 前缀匹配REVERSED
: row key 倒序扫描VERSIONS
: (int)返回多个版本的数据ALL_METRICS
: (bool)是否显示扫描的指标数据METRICS
: 查看指定指标数据["<xxx>"]
CACHE
: (int)指定每次要缓存多少条数据, 可加速查询MAXLENGTH
:(int) 指定返回数据的最大长度(可以用来限制返回超长的数据)TIMERANGE
: 限定时间戳范围[1303668804000, 1303668904000]
(毫秒, 前闭后开)TIMESTAMP
: 指定时间的数据FILTER
: 对结果进行过滤FILTER
进行额外的补充介绍过滤条件可添加多个, 如:
`FILTER=>"fun1() and (fun2() or fun3())"
你要是想问我文档在哪里?? 不好意思, 没找到. 不过经过我多方尝试, 发现这些方法都是hbase
官方jar
包中实现的过滤功能, 也就是说, 如果你是用JAVA
开发, 那就可以自己写过滤器.
不过虽然没有找到官方文档, 我还是另辟蹊径找到了所有可用的过滤器. 没错, 就是去看jar
包的内容. 看到这个过滤器的父类是: FilterBase
. 进而找到所有在org.apache.hadoop.hbase.filter
包下的实现类:
各个过滤器的参数, 可看其各自的构造方法. 简单列一下其中可用的方法:
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 '<table name>'
: 查看记录总数status
: 查看服务器状态version
: 查看版本list
: 查看所有表help '<command name'
: 查询指定命令的帮助信息表结构相关:
create '<table name>','<column family1>','<column family2>',...
: 建表describe '<table name>'
: 查看表的描述信息alter '<table name>', '<column family>'
: 增加一个列族alter '<table name>', {NAME => '<column family>', METHOD => 'delete’}
: 删除一个列族is_enabled '<table name>'
: 查看表是否启用is_disabled '<table name>'
: 查看表是否禁用enabled '<table name>'
: 启用表disabled '<table name>'
: 禁用表exists '<table name>'
: 查看表是否存在drop '<table name>'
: 删除表(需要先禁用)数据相关:
put '<table name>','<row key>','<column family:key>','<value>'
: 插入数据delete '<table name>', '<row key>','<column family:key>',<timestamp>
: 删除数据(也可以不带时间戳, 删除所有版本)deleteall '<table name>', '<row key>'
: 删除一行数据