文章目录
| 命令 | 功能 |
|---|---|
| create | 创建表 |
| put | 插入或者更新数据 |
| get | 获取限定行或者列的数据 |
| scan | 全表扫描或扫描表并返回表的数据 |
| describe | 查看表的结构 |
| count | 统计行数 |
| delete | 删除指定的行或列的数据 |
| deleteall | 删除整个行或者列的数据 |
| truncate | 删除表的数据,结构还在 |
| drop | 删除整个表(包括数据) |
有以下的订单数据,需要将其保存在HBase中
| 订单id | 订单状态 | 支付金额 | 支付方式 | 用户id | 操作时间 | 商品分类 |
|---|---|---|---|---|---|---|
| 001 | 已付款 | 189.5 | 1 | 100001 | 2023-3-6 9:10:24 | 手机 |
注意:需要提前启动 ZooKeeper、hdfs、hbase集群

命令格式:
create '表名','列簇名1'[,'列簇名2',...]

注意:create要小写,一个表可以有多个列簇
命令格式:
describe '表名'

命令格式:
list
命令格式:
disable '表名'

命令格式:
enable '表名'

命令格式:
drop '表名'

注意:表处于启用状态时是无法删除的,若要删除表需要先禁用表,在进行删除。
命令格式:
put '表名','rowkey行键','列簇名:列名',值

依次添加其他的数据

注意:如果显示中文乱码,是因为hbase的shell中显示的是中文的十六进制编码,要解决中文乱码,需要添加选项,jrubby语法格式:
{属性名=>属性值}如果有多个属性,中间用逗号格式




再次添加另一个rowkey的数据


命令格式:
get '表名','rowkey'


命令格式:
get '表名','rowkey','列簇名:列名'

命令格式:
put '表名','rowkey行键','列簇名:列名',新值

说明:
命令格式:
delete '表名','行键','列簇名:列名'


命令格式:
deleteall '表名','行键'

命令格式:
truncate '表名'



注意:集群启动
- 启动ZooKeeper
- 启动hdfs
- 启动HBASE
- 进入shell命令行
create 'ORDER_INFO' ,'C1'



此时,HBase的数据在HDFS上是的存储查看

统计表中有多少条数据
语法:
count '表名'
功能:统计rowkey不同的行数

注意:当数据量很大的时候,这个操作是比较耗时的
当数据量很大很大的时候,可以通过HBase提供的MR程序进行计数,这个mr程序是
org.apache.hadoop.hbase.mapreduce.RowCounter,语法格式:
hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'
此时需启动yarn


启动计数命令
hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'



语法:
scan ‘表名’,{FORMATTER=>‘toString’}

注意:尽量避免全表扫描一张很大很大的表
语法:
scan ‘表名’,{FORMATTER=>'toString',LIMIT=>数字}

Rubby语法:
scan ‘表名’,{FORMATTER=>'toString',COLUMNS=>[‘列簇名1:列名1’,’列簇名1:列名2’,...]}
scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>3,COLUMNS=>['C1:CATEGORY','C1:PAY_MONEY']}

语法:
scan ‘表名’,{FORMATTER=>'toString',ROWPREFIXFILTER=>’rowkey一部分’}
scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>['C1:CATEGORY','C1:PAY_MONEY'],ROWPREFIXFILTER=>'e'}


在HBase中,如果要对海量的数据进行扫描查询,尤其是全表扫描效率很低,可以使用过滤器Filter来提高查询的效率。过滤器Filter可以根据主键、列簇、列、版本号(时间戳)等条件对数据进行查询过滤。
在HBase中,使用过滤器有两种方式,一种就是使用命令行基于jRubby语法的选项实现交互式查询,另一种是基于HBase的JAVA API的方式进行编程开发。
官网文档:https://hbase.apache.org/devapidocs/index.html
可以通过show_filters命令,查看hbase内置的过滤器

我们来解释一下这些过滤器的用法:
| 类型 | 过滤器 | 功能 |
|---|---|---|
| rowkey过滤器 | RowFilter | 实现行键字符串的比较和过滤 |
| PrefixFilter | rowkey的前缀过滤器 | |
| KeyOnlyFilter | 只对单元格的键过滤不显示值 | |
| FirstKeyOnlyFilter | 只扫描显示相同键的第一个单元格,其对应的键值会显示出来 | |
| 列过滤器 | FamilyFilter | 列簇过滤器 |
| QualifierFilter | 列限定符过滤器,只显示对应列簇列名的数据 | |
| ColumnPrefixFilter | 对列名的前缀进行限定 | |
| MultipleColumnPrefixFilter | 对多个列名的前缀进行限定 | |
| ColumnRangeFilter | 列名称范围的过滤器 | |
| 值过滤器 | ValueFilter | 值过滤器,查询符合条件的键值对 |
| SingleColumnValueFilter | 对单个值进行过滤 | |
| ColumnValueFilter | 列值的过滤器 | |
| SingleColumnValueExcludeFilter | 排除匹配成功的值 | |
| 其他过滤器 | ColumnPaginationFilter | 列分页过滤器,返回offset、limit的列 |
| PageFilter | 分页过滤器,分页显示 | |
| TimestampsFilter | 时间戳过滤器 | |
| ColumnCountGetFilter | 限制每个逻辑行返回值对的个数 | |
| DependentColumnFilter | 依赖列过滤器 | |
过滤器一般结合scan来使用
scan "ORDER_INFO",{FORMATTER=>'toString',FILTER=>"RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}

一般语法:
scan ‘表名’,{FILTER=>”过滤器的名称(参数列表(如比较运算符,比较器))”}
比较运算符是我们比较常见的。
| 运算符 | 功能 |
|---|---|
| = | 等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| != | 不等于 |
| 比较器 | 功能 |
|---|---|
| BinaryComparator | 匹配完整的字节数组 |
| BinaryPrefixComparator | 匹配字节数组的前缀 |
| BitComparator | 匹配比特位 |
| NullComparator | 匹配空值 |
| RegexStringComparator | 匹配正则表达式 |
| SubstringComparator | 匹配子字符串 |
| 比较器 | 表达式缩写 |
|---|---|
| BinaryComparator | binary:值 |
| BinaryPrefixComparator | binaryprefix:值 |
| BitComparator | bit:值 |
| NullComparator | null |
| RegexStringComparator | regexstring:正则表达式 |
| SubstringComparator | substring:值 |
查询指定订单的数据,订单号为“e8b3bb37-1019-4492-93c7-305177271a71”,订单状态及支付方式

只需要两个参数
scan 'ORDER_INFO',{FORMATTER=>'toString',COLUMNS=>['C1:STATUS','C1:PAYWAY'],FILTER=>"RowFilter(=,'binary:e8b3bb37-1019-4492-93c7-305177271a71')"}

查询状态为已付款的订单

需要传入四个参数
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"SingleColumnValueFilter('c1','STATUS',=,'binary:已付款')"}

注意:
查询支付方式为1,且支付金额大于8000的订单
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:8000')
scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:8000')"}

注意:
我们还可以加上限定列:
scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:8000')",COLUMNS=>['C1:PAYWAY','C1:PAY_MONEY']}

查询类别为“维修;手机;”或者“数码;女装;”,并且状态为“已付款”的订单,只显示类别和状态
完整的命令
scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "(SingleColumnValueFilter('C1', 'CATEGORY', = , 'binary:维修;手机;') OR SingleColumnValueFilter('C1', 'CATEGORY', = , 'binary:数码;女装;')) AND SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')",COLUMNS=>['C1:CATEGORY','C1:STATUS']}

选择操作时间在2020-04-25,12点8分到9分之间的已完成的订单,只显示操作时间和状态
scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "SingleColumnValueFilter('C1', 'OPERATION_DATE', > , 'binary:2020-04-25 12:08:00') AND SingleColumnValueFilter('C1', 'OPERATION_DATE', = , 'binary:2020-04-25 12:09:00')",COLUMNS=>['C1:OPERATION_DATE','C1:STATUS']}

incr(increament)命令可以实现某个单元格的值进行原子性计数累加,默认累加1
某新闻app应用为了统计每个新闻的每隔一段时间的访问次数,将新闻数据保存在HBase中,该表格的数据如下所示,要求原子性的增加新闻的访问次数
| 新闻ID | 访问次数 | 时间段 | rowkey |
|---|---|---|---|
| 0000000001 | 12 | 00:00-01:00 | 0000000001_00:00-01:00 |
| 0000000002 | 20 | 01:00-02:00 | 0000000002_01:00-02:00 |
语法:
incr ‘表名’,‘rowkey’,‘列簇名:列名’,[累加值]
说明:




上传服务器

导入HBase

显示前5条数据

不能使用get来获取计数器的值

语法:
get_counter ‘表名’,‘rowkey’,‘列簇名:列名’




查看服务器的状态

显示当前用户

显示当前的所有的表

统计表的记录数

显示表的结构信息

判断某个表是否存在

判断某个表是否被启用或者禁用

改变表和列簇的模式



这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam