HBase 命令行

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命令使用, 在countget都可以用. 有一些暂时认为用不到的就直接忽略了, 可以通过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: 列名区间匹配(比如一行数据有一万列, 返回其中部分). 字符串比较
    • 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>': 删除一行数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《论可计算数及其在判定上的应用》简单理解

刚刚拜读了一本书, 《图灵的秘密》. 该书介绍了图灵的论文《论可计算数及其在判定上的应用》, 其指出: 一个拥有铅笔, 纸和一串明确指令的人类计算者, 可以被看做是一种图灵机. 那么图灵机是什么呢? 是图灵为了描述可计算数而引出的一个虚构的可以做一些简单操作的计算机器. 尽…

PHP为什么empty可以访问不存在的索引

开始之前, 先抛出问题: $arr []; echo empty: , PHP_EOL; var_dump(empty($arr[1])); echo is_array: , PHP_EOL; var_dump(is_array($arr[1]));这段代码的运行结果: 你是否和我有过同样的疑问? 同样是函数, 为什么empty访问不存在的索引就不会报错呢? 按理说哈, 函数调用的…

浮点数运算丢失精度

今天碰到了这样一个情况, 使我又去翻阅了原来课本, 在Pthon中如果输入下面这段程序: print(sys.float_info.max - 1.0) print(sys.float_info.max)结果如下: 结果发现, 这数字根本没有变化. 本来这没什么, 看这数字, 10的308次方, 也就是说, 减去的1是在308位之后了, 这里没有…

变量的作用域

起因 最近闲来无事, 在 Python 官网上看到了2.0版本, 是2001年的. 打算装起来体验一下最初发布的版本, 但是发现只有 Windows 版本, 所以我就装了个 Windows10的虚拟机, 就在我打算安装的时候, 发现: 这激起了我的好胜欲, 于是我就依次安装了Windows 8, Windows 7, Windows XP…

PHP8的注解

PHP8.0增加了注解的支持, 虽然 PHP的注解没用过, 但是咱用过JAVA的注解呀. 注解这玩意怎么用? 简单说就下面几步: 定义注解类使用注解提取注解 到了PHP中, 也基本上换汤不换药. 使用 定义注解类 #[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_FUNCTION)] cl…

目的论浅谈

一些心理学主张, 我们的现在乃至未来, 都是由过去所经历的事情所决定的, 这种思想被称为 “原因论”, 同时也符合佛家的思想. 而相对的另一种解释就是 “目的论”. 举个例子, 如果你在饭店吃饭, 被服务员不小心把汤打翻了, 泼了你一身. 此时, 你愤怒不已, 站起身来破口大骂, 此…

HBase 数据存储结构

在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下支持多版本数据 这看着感觉也没有那么太大的区别呀, 它解决了 MySQL 的那些问题呢? 每一个新事物的出现, 都是为了解决原本存在的问题. 对写入…

HBase 文件合并

HBase在存储时, 使用了LSM树来进行数据存储, 会定期将文件进行合并, 以提升数据的查询效率, LSM树都是这么处理的. 那么到这里就有一个问题了, HBase在进行文件合并的时候, 势必会占用大量 IO, 难道不会对正常的业务产生影响么? 抱着这个疑问, 我去找了找HBase文件合并的方式.…

spark计算操作整理

spark 的计算流程大概如图: 其中, 通过多次处理, 生成多个中间数据, 最后对结果进行操作获得数据. 本文不涉及任何原理, 仅总结spark在处理的时候支持的所有操作, 方便后面使用的时候, 可以参照本文进行数据的处理. 以下函数整理, 基与Python中RDD对象. 数据的转换操作 数据…

软件工程模型

你在工作中, 软件的开发流程是怎样的? 你是否想过, 除了你当前使用的流程, 还存在其他怎样的流程? 现在的流程有哪些问题, 又能够如何解决? 别说, 前辈们已经给出了一些项目流程的模型, 既软件工程. 可以简单了解一下, 带动一下我这生了锈的脑子. 在很久以前, 一个软件的从…

关于对接需求的思考

产品说想要一个登录注册的功能, 你一想, 好说, 不就是用户名密码嘛, 然后开发完成 产品看到成果后: 我要的是手机验证码登录结果写好的功能基本废了 产品又想要一个登录注册的功能, 这回你学乖了, 确认了一下, 是手机验证码登录, 没问题, 然后开发完成 产品拿到成果: 怎么没有验…

路径.git下的文件

用了这么久的git, 可以毫不谦虚地说对git是一无所知. 每天用来用去的就是commit, add, merge 等几个有限的命令, 这不符合我这刨根问底的性格啊. 不行, 得研究研究, 从哪里下手呢? 别的咱先不说, 所有 git 项目都有这么一个文件夹.git, 不如就从它入手 ? 那咱就看看这个文件夹…

git 操作二进制文件

平常用git进行项目管理已经稀松平常了, 今天咱来点不一样的. 平常管理的都是普通的文本文件, 如果是二进制文件, git能够处理么? 比如word文档. 测试一下. 新建一个项目, 在其中创建test1.docx, test2.txt两个空文件并提交. 之后编辑文件并添加标题, git diff看一下效果: 效…

Go 常量定义

定义常量在各个语言中都是不可或缺的语法了. 而有些语言在常量的基础上, 增加了枚举类型, 比如C. enum Weekday {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY };上面的枚举, 对应的值依次为0到6. 而在Go中, 是没有提供枚举类型的. 如果实现上面相同的功能, 难…

搭建个人博客

一直都想着搞一个自己的个人博客, 拖着这么久, 最近终于开始动手了. 故留下一篇完整的记录, 若你也刚好有相同的需要, 那这篇文章应该恰好能够帮助到你. 准备 云服务器个人域名 如果没有云服务器, 将应用跑在自己的电脑上, 通过内网穿透大概也能达到效果, 但是个人电脑实在没…

nginx 配置文件的匹配规则

引出 之前在对php-fpm 进行nginx代理时, 为了对后台限定 IP 访问, 添加了如下配置: location ^~ /admin {allow 127.0.0.1;deny all; }结果呢? 所有admin路径下的php文件, 全都没有解析, 变成文件下载了. 当时我不知道是什么问题, 不过将这段配置去掉之后, 问题就消失了. 所…

分库后如何分页

前言 在实际应用中, 为了降低单表的数据量, 会对较大的表进行水平切分, 将单表的数据切分到多表多库中. 既然要切分, 就要有一个切分的依据, 比如说按照 ID 取模等. 那么多张表联合分页是如何做到的呢? 如果分表的依据是字段 A, 但是需要根据字段 B 进行分页查询, 针对这种…

计算机是如何进行时间同步的

WHY 在网络世界中, 各个计算机之间要想协同工作, 时间同步是一个十分重要的基础. 在计算机内部是有自己的时间的, 这个时间通过内部的晶体振荡器差生的固定频率, 来模拟时间流逝进行计算. 虽然频率十分稳定, 但也是有误差的, 虽然现在的工艺水平误差已经十分小了. (关于震荡的…

WordPress架构简单剖析

前言 最近在搭建自己的博客站点时, 选择了网站使用较多的WordPress, 随着慢慢的使用, 它灵活的插件和主题令我折服. 基本上任何想要实现的功能, 都可以在上面通过插件的形式进行添加. 无论是在访问前的缓存、访问后的统计、访问中的过滤、各种流程的修改等等, 几乎都能够以插件…

Gale-Shapley算法

前言 最近看了一档综艺《心动的信号》(唉, 单身久了, 开始喜欢看别人谈恋爱了) 节目中共有n男n女, 他们会在节目的最后进行表白, 如果我喜欢你, 恰好你也喜欢我, 那么便就会在一起, 自此传为一段佳话. 于是, 我就在想, 如何用算法来实现这个匹配的过程呢? 单一匹配 将信息…