前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HBase 命令行

HBase 命令行

作者头像
烟草的香味
发布2020-12-08 17:56:07
1.7K0
发布2020-12-08 17:56:07
举报
文章被收录于专栏:烟草的香味
  • 读取数据
    • 单条数据查询
    • 全表扫描
    • 数据过滤属性
    • 脚本查询
  • 其他命令

hbase是一款分布式数据库. 其对数据的索引只通过row key进行. 在存储数据的时候, 通过row key的排序进行存储. 在面对一个新的数据库时, 深究其原理并不知一个明智的选择, 正如开车一般, 大多数人都是先学会开车, 然后在开车的过程中车子出故障了, 再慢慢学着去修理. 不管怎么说, 第一步都是要先会使用.

这篇文章主要为了整理hbase命令行的使用, 留待以后用到时翻阅.

读取数据

因为一个数据库使用, 通常最复杂的命令就是查询, 故而将大篇幅都给了查询. 哦对, 如果你现在还没有数据, 先跳到文章底部, 那里有建表和数据插入的操作.

hbase没有索引, 访问hbase中的数据只有三种方式:

  1. 通过指定row key访问
  2. 通过row key范围访问
  3. 全表扫描

单条数据查询

  • 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进行额外的补充介绍

过滤条件可添加多个, 如:

`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: 列名区间匹配(比如一行数据有一万列, 返回其中部分). 字符串比较
    • 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>': 删除一行数据
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 读取数据
    • 单条数据查询
      • 全表扫描
        • 数据过滤属性
          • 字段过滤
          • 数量限制
          • row key 过滤
          • 排序
          • 其他
          • 条件过滤
          • 对FILTER进行额外的补充介绍
        • 脚本查询
        • 其他命令
        相关产品与服务
        TDSQL MySQL 版
        TDSQL MySQL 版(TDSQL for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档