HBase 命令行
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
: 限制返回结果数量
row key 过滤#
STARTROW
: 限定扫描 row key 起始行STOPROW
: 限定扫描 row key 结束行ROWPREFIXFILTER
: row key 前缀匹配
排序#
REVERSED
: row key 倒序扫描- TRUE/FALSE
其他#
VERSIONS
: (int)返回多个版本的数据ALL_METRICS
: (bool)是否显示扫描的指标数据METRICS
: 查看指定指标数据["<xxx>"]
CACHE
: (int)指定每次要缓存多少条数据, 可加速查询MAXLENGTH
:(int) 指定返回数据的最大长度(可以用来限制返回超长的数据)
条件过滤#
TIMERANGE
: 限定时间戳范围[1303668804000, 1303668904000]
(毫秒, 前闭后开)
TIMESTAMP
: 指定时间的数据FILTER
: 对结果进行过滤
对FILTER
进行额外的补充介绍#
过滤条件可添加多个, 如(注意其中 AND 和 OR必须是大写, 小写会报错):
`FILTER=>"fun1() AND (fun2() OR fun3())"
你要是想问我文档在哪里?? 不好意思, 没找到. 不过经过我多方尝试, 发现这些方法都是hbase
官方jar
包中实现的过滤功能, 也就是说, 如果你是用JAVA
开发, 那就可以自己写过滤器.
不过虽然没有找到官方文档, 我还是另辟蹊径找到了所有可用的过滤器. 没错, 就是去看jar
包的内容. 看到这个过滤器的父类是: FilterBase
. 进而找到所有在org.apache.hadoop.hbase.filter
包下的实现类:
各个过滤器的参数, 可看其各自的构造方法. 简单列一下其中可用的方法:
row key 过滤
PrefixFilter
: row key 前缀匹配PrefixFilter('test')
: 匹配所有'test'开头的row key
FuzzyRowFilter
: row key 中间匹配(不支持命令行, 可通过RowFilter
正则实现)RowFilter
: 对 row key 进行比较RowFilter(op, value)
: 参数参考SingleColumnValueFilter
列名过滤
ColumnPrefixFilter
: 列族下的 key 前缀匹配ColumnPrefixFilter('test')
: 匹配所有'test'开头的 key
MultipleColumnPrefixFilter
: 与ColumnPrefixFilter
作用类似, 不过可以匹配多个, 相当于多个ColumnPrefixFilter
的或操作MultipleColumnPrefixFilter('test1', 'test2')
ColumnRangeFilter
: 列名区间匹配(比如一行数据有一万列, 返回其中部分). 字符串比较ColumnRangeFilter(minColumn, minColumnInclusive, maxColumn, maxColumnInclusive)
minColumn
: 最小的列(string). max同理minColumnInclusive
: 是否包含最小列(bool). max 同理
DependentColumnFilter
: 返回存在的匹配列(判断是否存在). (仅返回匹配列)DependentColumnFilter(family, qualifier)
QualifierFilter
: 对列名进行匹配过滤QualifierFilter(op, value)
: 参数参考ColumnValueFilter
列值过滤
SingleColumnValueFilter
: 对列值进行比较过滤. 大于小于等于ColumnValueFilter(family, qualifier, op, value)
family
: 列族名称qualifier
: 列名op
: =, !=, >, <, <=, >=...value
: 进行比较的值substring:xxx
: 字符串前缀比较 (只能使用=/!=)regexstring:xxx
: 字符串正则比较(只能使用=/!=)binary:xxx
: 字典序比较binaryprefix:xxx
: 字典序前缀比较
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>'
: 删除一行数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY